3

如何按名称调用顶级函数?例如,

#!/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
4

4 回答 4

9

最简单的方法是使用globals

globals()[func_name]()

您还可以通过在sys.modules.

getattr(sys.modules[__name__], func_name)()
于 2012-10-01T04:35:51.970 回答
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在我的示例中)。

于 2012-10-01T05:04:10.160 回答
1

您可以将函数别名作为值放入字典中,其中键是方法名称的字符串版本。

import sys

def foo():
    print 'foo'

def bar():
    print 'bar'

functions = {'foo': foo, 'bar': bar}
functions[sys.argv[1]]()

如果您最终更改由命令行参数键调用的方法,它还有一个额外的好处是灵活。

于 2013-08-02T22:46:29.613 回答
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

我知道这已经晚了,但有人问了这个问题,所以添加了一个替代方案

于 2016-10-28T22:30:14.647 回答