关于python:从set变量调用函数?

Calling a function from a set variable?

本问题已经有最佳答案,请猛点这里访问。

我编写了一个python脚本,我想做的是将输入捕获到一个变量中,然后使用该变量调用具有该名称的函数。下面是一个例子:

1
2
3
4
5
def test():
    print"You want to do a test!"

option = raw_input("What do you want to do?") #User types in test
option()

现在这不起作用了,因为python并没有将选项视为变量,而是试图调用函数"option"。做这件事最要紧的方法是什么?


eval()将起作用,但正如@matdmo所说,这是危险的。

如果您的函数是模块全局变量,那么这是一种更安全的方法:

1
globals()[option]()

globals()是将字符串映射到这些字符串绑定到的模块全局对象的字典。因此,globals()[option]在该dict中查找绑定到option的字符串,并返回该对象;例如,globals["test"]返回test()的函数对象。然后在末尾添加()调用该函数对象。宾果-你完了。


我喜欢在这种情况下使用听写。如果用户提供的答案不是预期的,甚至可以指定默认选项。

1
2
3
4
5
6
7
8
9
10
11
12
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)()


我想,这是裸机input的实际用途:

1
2
option = input("What do you want to do?") #User types in test
option()

这在语义上等同于eval(raw_input())。注意,在python 3中,raw_input变为input,因此您必须显式地使用eval

这类操作的一般警告是极其不安全的。但我认为从您的要求来看,这是显而易见的,允许用户访问运行任意代码,所以…


您可以使用python eval

从帮助页面,eval在全局和局部上下文中评估源。源可以是表示python表达式的字符串,也可以是compile()返回的代码对象。

例如:

1
2
3
4
5
 def a():
     print"Hello"

 inp = raw_input()
 eval(inp +"()")

在stdin输入a时,将执行函数a。请注意,如果不进行任何安全检查,这可能很危险。


您需要非常小心地运行任意代码,但是如果绝对需要,您可以使用eval()函数。

更好的方法是为用户提供一个选项菜单,然后对option的内容进行测试,看看他们选择了哪个选项,然后运行该函数。