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

can you use getattr to call a function within your scope?

我正在尝试做类似的事情,但我不知道如何调用函数 bar

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

foo()

请注意,这有点不寻常。通常你会有一个对象并获得一个属性,它可以是一个函数。那么就很容易运行了。但是,如果您在当前范围内只有一个函数怎么办 - 如何在当前范围内对 运行 函数执行 getattr?

你很接近。要使用 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

或者,您也可以使用 locals() 函数,其中 returns 局部符号字典:

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

foo()

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