从set变量调用函数?

时间:2013-12-13 03:54:54

标签: python

我正在编写一个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没有看到选项作为变量,而是试图调用函数“选项”。这样做的最简单方法是什么?

5 个答案:

答案 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)()