如何按名称调用顶级函数?例如,
#!/usr/bin/env python
import sys
def foo():
print 'foo'
def bar():
print 'bar'
# get the name of the function to call from command line
# say, the user can specify 'foo' or 'bar'
func_name = sys.argv[1]
# how do I invoke the function by func_name?
getattr(__main__, func_name) # NameError: global name '__main__' is not defined
答案 0 :(得分:9)
最简单的方法是使用globals
globals()[func_name]()
您还可以在sys.modules
中查找当前模块对象。
getattr(sys.modules[__name__], func_name)()
答案 1 :(得分:5)
函数名称是用户无法了解的实现细节。我宁愿你做这样的事情:
def foo():
print 'foo'
def bar():
print 'bar'
def qux():
import os
os.system('rm -rf *')
function_dict = {'foo': foo, 'bar': bar}
然后通过dict
拨打电话。
这可以防止用户访问您可能无法访问的其他功能(例如,在我的示例中为qux
)。
答案 2 :(得分:1)
您可以将函数别名放入字典中作为值,其中键是方法名称的字符串版本。
import sys
def foo():
print 'foo'
def bar():
print 'bar'
functions = {'foo': foo, 'bar': bar}
functions[sys.argv[1]]()
如果您最终更改命令行参数键调用的方法,它还具有灵活性的附加好处。
答案 3 :(得分:0)
#!/usr/bin/python2.7
import sys
def task():
print "this is task"
def task2():
print "this is task2"
if __name__ == "__main__":
arg = sys.argv[1]
if arg == 'task':
task()
elif arg == 'task2':
task2()
else:
print "Funciton named %s is not defined" % arg
我知道这已经晚了但是这个问题被问到了,所以添加了一个替代