24

假设我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”的内置函数。但是,它需要“模块对象”作为第一个参数。如何获取当前模块的“模块对象”?

4

2 回答 2

41

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

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

于 2012-10-11T18:19:43.530 回答
16

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

if __name__ == '__main__':
  funcnames = {'bar': bar}
  funcnames['bar']()
于 2012-10-11T18:20:39.303 回答