在Python中用同一个模块中的字符串调用函数?

时间:2012-10-11 18:18:24

标签: python string function

假设我在名为bar的模块中有一个函数foo.py。在foo.py中的某个地方,我希望能够从字符串“bar”调用bar()。我该怎么做?

# filename: foo.py
import sys

def bar():
  print 'Hello, called bar()!'

if __name__ == '__main__':
  funcname = 'bar'
  # Here I should be able to call bar() from funcname

我知道python中存在一些名为'getattr'的内置函数。但是,它需要'模块对象'作为第一个参数。如何获取当前模块的“模块对象”?

2 个答案:

答案 0 :(得分:25)

globals可能更容易理解。它会返回当前模块__dict__,因此您可以执行以下操作:

func_I_want = globals()['bar']  #Get the function
func_I_want()    #call it

如果你真的想要模块对象,你可以从sys.modules获得它(但你通常不需要它):

import sys.modules
this_mod = sys.modules[__name__]
func = getattr(this_mod,'bar')
func()

请注意,一般情况下,您应该问自己为什么要这样做。这将允许通过字符串调用任何函数 - 这可能是用户输入...如果您不小心让用户访问了错误的函数,这可能会产生潜在的不良副作用。

答案 1 :(得分:13)

使用保存要调用的函数映射的字典:

if __name__ == '__main__':
  funcnames = {'bar': bar}
  funcnames['bar']()