2024-04-19 08:22:24 发布
网友
python中有没有一种方法(不使用switch语句或if和数组)调用与输入同名的函数。E、 g
x=input("string input") def foo(): print("foo") def bar(): print("bar")
如果x是"foo",我想调用foo()
x
"foo"
foo()
如果该函数是在全局范围内定义的,则可以在全局命名空间字典中查找,您可以使用函数globals()访问该字典:
globals()
f = globals().get(x) if f: f() else: print("Function %s not found" % x)
按你的要求做是可能的,但通常不是一个好主意。eval()几乎可以被任何用户用来对您的计算机执行任何操作(它执行传递给它的任意代码)。使用locals()切分到局部变量列表并不能保证不会抛出异常,而且与任意代码执行相关的安全问题也存在。更好的方法是创建一个字典,将函数映射到字符串,作为用户选择的选项。。。你知道吗
eval()
locals()
def foo(): pass def bar(): pass def baz(): pass dict_of_functions = {'foo': foo, 'bar': bar, 'baz': baz} choice = raw_input('select a function') #just input() for python 3.x chosen_func = dict_of_functions[choice] chosen_func()
您的需求的问题是您混合了两种语言:您的程序语言和用户使用的语言。正如@Aaron所提到的,您可以使用字典,在这两种语言之间进行映射(参见这里)。你知道吗
重要的是,您可以轻松地更改预期的输入或函数名—这些名称是分离的(“解耦”)。您还知道恶意用户不能调用任何其他函数。你知道吗
如果该函数是在全局范围内定义的,则可以在全局命名空间字典中查找,您可以使用函数
globals()
访问该字典:按你的要求做是可能的,但通常不是一个好主意。
eval()
几乎可以被任何用户用来对您的计算机执行任何操作(它执行传递给它的任意代码)。使用locals()
切分到局部变量列表并不能保证不会抛出异常,而且与任意代码执行相关的安全问题也存在。更好的方法是创建一个字典,将函数映射到字符串,作为用户选择的选项。。。你知道吗您的需求的问题是您混合了两种语言:您的程序语言和用户使用的语言。正如@Aaron所提到的,您可以使用字典,在这两种语言之间进行映射(参见这里)。你知道吗
重要的是,您可以轻松地更改预期的输入或函数名—这些名称是分离的(“解耦”)。您还知道恶意用户不能调用任何其他函数。你知道吗
相关问题 更多 >
编程相关推荐