在Python中按名称调用顶级函数

时间:2012-10-01 04:28:53

标签: python

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

#!/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 个答案:

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

我知道这已经晚了但是这个问题被问到了,所以添加了一个替代