Виклик функції модуля з допомогою його імені (рядка)

Як найкраще викликати функцію, якщо в програмі на Python задано рядок з іменем функції. Наприклад, нехай у мене є модуль foo, і у мене є рядок, вміст якого має вигляд "bar". Як краще викликати foo.bar()?

Мені потрібно отримати значення, що повертається функцією, тому я не можу просто використати eval. Я зрозумів, як це зробити, використовуючи eval для визначення тимчасової функції, яка повертає результат виклику цієї функції, але я сподіваюся, що є більш елегантний спосіб зробити це.

Рішення

Припустимо, модуль foo з методом bar:

import foo
method_to_call = getattr(foo, 'bar')
result = method_to_call()

Можна було б скоротити рядки 2 та 3 до:

result = getattr(foo, 'bar')()

якщо це має більше сенсу для вашого варіанта використання.

Ви можете використовувати getattr таким чином у методах, пов'язаних з екземпляром класу, методах на рівні модуля, методах класу... список можна продовжувати.

Коментарі (12)
locals()["myfunction"]()

або

globals()["myfunction"]()

locals повертає словник з поточною локальною таблицею символів. globals повертає словник з глобальною таблицею символів.

Коментарі (4)

Рішення Патріка, мабуть, найчистіше. Якщо вам також потрібно динамічно підхопити модуль, ви можете імпортувати його як:

module = __import__('foo')
func = getattr(module, 'bar')
func()
Коментарі (6)