Вы можете использовать getattr для вызова функции в вашей области? - PullRequest
0 голосов
/ 11 октября 2018

Я пытаюсь сделать что-то подобное, но я не могу понять, как вызвать функцию bar.

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

foo()

Обратите внимание, что это несколько необычно.Обычно у вас есть объект и вы получите атрибут, который может быть функцией.тогда легко бегать.но что, если у вас просто есть функция в текущей области действия - как выполнить getattr в текущей области для запуска функции?

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

альтернативно, вы также можете использовать функцию locals(), которая возвращает указание локальных символов:

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

foo()

Она также позволяет вам получить функцию по имени вместоего ссылка без необходимости пользовательского сопоставления.

0 голосов
/ 11 октября 2018

Вы рядом.Чтобы использовать 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
...