您可以使用getattr调用您范围内的函数吗?

时间:2018-10-11 14:53:29

标签: python getattr

我正在尝试执行类似的操作,但是我不知道如何调用函数bar

def foo():
    def bar(baz):
        print('used getattr to call', baz)
    getattr(bar, __call__())('bar')

foo()

注意,这有点不寻常。通常,您将有一个对象并在该对象上获得一个属性,该属性可以是一个函数。那么它很容易运行。但是,如果您仅在当前作用域内有一个功能,该怎么办-如何在当前作用域内执行getattr来运行该功能?

2 个答案:

答案 0 :(得分:3)

您很近。要使用getattr,请传递属性name的字符串值:

getattr(bar, "__call__")('bar')

def foo():
  def bar(baz):
    print('used getattr to call', baz)
  getattr(bar, "__call__")('bar')

foo()

输出:

used getattr to call bar

答案 1 :(得分:2)

或者,您也可以使用locals()函数,该函数返回本地符号的字典:

def foo():
  def bar(baz):
    print('used getattr to call', baz)
  locals()['bar']('pouet')

foo()

它还允许您通过函数名称而不是引用来获取函数,而无需自定义映射。