我正在编写一个python脚本,我想要做的是将输入捕获到变量中,然后使用它来调用具有该名称的函数。这是一个例子:
def test():
print "You want to do a test!"
option = raw_input("What do you want to do? ") #User types in test
option()
现在这不起作用,因为python没有看到选项作为变量,而是试图调用函数“选项”。这样做的最简单方法是什么?
答案 0 :(得分:3)
eval()
会起作用,但正如@MattDMo所说它可能很危险。
如果你的函数是模块全局变量,那么更安全的方法是执行此操作:
globals()[option]()
globals()
是一个字典,它将字符串映射到这些字符串绑定到的模块全局对象。所以globals()[option]
在该dict中查找绑定到option
的字符串,并返回该对象;例如,globals["test"]
返回test()
的函数对象。然后在末尾添加()
调用该函数对象。宾果 - 你已经完成了。
答案 1 :(得分:0)
您希望在运行任意代码时要非常小心,但如果您绝对需要,可以使用eval()
函数。
更好的方法是为用户提供一系列选项,然后对option
的内容进行测试,看看他们选择了哪一个,然后运行该功能。
答案 2 :(得分:0)
您可以使用python eval
。
在帮助页面中,eval在全局变量和局部变量的上下文中计算源。源可以是表示Python表达式的字符串,也可以是compile()返回的代码对象。
例如:
def a():
print "Hello"
inp = raw_input()
eval(inp + "()")
在stdin输入a
时,将执行函数a
。请注意,这可能是危险的,没有任何安全检查。
答案 3 :(得分:0)
我认为这是裸input
的实际用途:
option = input("What do you want to do? ") #User types in test
option()
这在语义上等同于eval(raw_input())
。请注意,在python 3中,raw_input
变为input
,因此您必须明确地eval
。
此类操作的常见警告非常不安全。但是我认为这显然是因为你要求用户提供运行任意代码的权限,所以......
答案 4 :(得分:0)
我喜欢在这样的情况下使用dict。如果用户提供了不期望的答案,您甚至可以指定默认选项。
def buy_it():
print "use it"
def break_it():
print "fix it"
def default():
print "technologic " * 4
menu = {"buy it": buy_it, "break it": break_it}
option = raw_input("What do you want to do? ")
menu.get(option, default)()