2013-12-13 53 views
0

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

回答

3

eval()将工作,但@MattDMo说它可能是危险的。

一个更安全的方式做到这一点,如果你的功能模块全局:

globals()[option]() 

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

+0

非常好,我忘了那个... – MattDMo

+0

太棒了!我认为这是赢家!现在我需要的是找出需要多个输入和一个捕获所有功能,但我认为我可以做一个尝试/除外。谢谢您的帮助! – stevo81989

0

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

什么可能是一个更好的办法是给用户一个选项菜单,然后做的option内容的测试,看看哪一个他们挑选,然后运行起作用的。

+0

嗯,有趣。所以我们要做的就是基本上有一个交互式shell,并基于用户输入的函数将基于输入运行。因此,如果用户键入ls,它将运行一个列出api文件的函数。现在我们有 如果输入==“ls”: 做功能 我想要它,所以我可以添加一个新的功能,而没有大量的if语句。我只是想知道是否有人有一个更简单的想法。 – stevo81989

+0

你不需要大量的if语句,你总是可以将函数名称存储在一个列表中,然后在列表中选择'if if选项:...' – MattDMo

+0

我喜欢这个,这是一个好主意。尽管我也喜欢Tim Peters。我认为它会工作得很好,唯一剩下的就是找出所有的东西(如果该命令不是作为函数发现的)和具有多个optins的东西(?,h,帮助所有的都指向一个函数),但可能很容易尝试/除外。谢谢您的帮助! – stevo81989

0

您可以使用python eval

在帮助页面中,eval将评估全局和本地语境中的源。源可以是一个表示由compile()返回的Python表达式或代码对象的字符串。

例如:

def a(): 
    print "Hello" 

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

在在标准输入进入a,函数a将被执行。请注意,没有任何安全检查,这可能是危险的。

0

这是我想,对于裸input实际使用:

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

这是语义上等同于eval(raw_input())。请注意,在python 3中,raw_input变成了input,所以你明确的必须要eval吧。

这种类型的操作通常非常不安全的警告适用。但我认为这是显而易见的,因为您要求用户访问运行任意代码,所以...

0

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

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