在python中是否有一种方法(不使用switch语句或者是否使用数组)来调用与输入同名的函数。 E.g。
x=input("string input")
def foo():
print("foo")
def bar():
print("bar")
如果x
为"foo"
,我想致电foo()
答案 0 :(得分:2)
做你所要求的是可能的,但通常不是一个好主意。 dist
几乎可以轻易地用于任何用户对您的计算机执行任何操作(它实际上执行传递给它的任意代码)。使用eval()
切换到本地变量列表并不能保证不抛出异常,并且有自己的安全问题与任意代码执行有关。更好的方法是创建一个字典,将函数映射到字符串作为用户选择的选项...
locals()
答案 1 :(得分:1)
您要求的问题是您混合使用两种语言:程序语言和用户使用的语言。正如@Aaron所提到的,你可以使用字典,在这两种语言之间进行映射(见那里)。
重要的是,您可以轻松更改预期输入或功能名称 - 这些是分开的(“解耦”)。您还知道恶意用户无法调用任何其他功能。
答案 2 :(得分:0)
由于潜在的安全风险,这是一个糟糕的主意。想象一下,人们可以决定在您的计算机中执行的任何功能。
您应该始终定义允许执行功能的边界。即将字典映射命令字符串定义为函数{"cmd": func}
这也很好地封装了命令名,可以更改基础函数而不会向用户公开这样的更改
答案 3 :(得分:0)
如果函数是在全局范围内定义的,则可以在全局命名空间字典中查找,您可以使用函数globals()
访问该字典:
f = globals().get(x)
if f:
f()
else:
print("Function %s not found" % x)