Каков наилучший способ вызова функции по заданной строке с именем функции в программе Python. Например, предположим, что у меня есть модуль foo
, и у меня есть строка с содержимым "bar"
. Как лучше всего позвонить foo.bar()
?
Мне нужно получить возвращаемое значение функции, поэтому я не просто использую eval
. Я выяснил, как это сделать, используя eval
для определения временной функции, которая возвращает результат вызова этой функции, но я надеюсь, что есть более элегантный способ сделать это.
foo
модуле вы можете использовать ,globals()
чтобы сделать это:methodToCall = globals()['bar']
или
locals возвращает словарь с текущей таблицей локальных символов. globals возвращает словарь с глобальной таблицей символов.
источник
Решение Патрика, наверное, самое чистое. Если вам нужно динамически подобрать модуль, вы можете импортировать его следующим образом:
источник
importlib.import_module
. Официальные документы говорят о__import__
: «Это продвинутая функция, которая не нужна в повседневном программировании на Python, в отличие от importlib.import_module ()». docs.python.org/2/library/functions.html#__import__importlib.import_module
поддерживается в версии 3.6. См. Docs.python.org/3.6/library/…Просто простой вклад. Если класс, который нам нужен для экземпляра, находится в том же файле, мы можем использовать что-то вроде этого:
Например:
И, если не класс:
источник
Получив строку с полным путем к Python пути к функции, я получил результат от указанной функции:
источник
__import__
функции.Лучший ответ в соответствии с часто задаваемыми вопросами по программированию на Python :
источник
Ответ (надеюсь) никто никогда не хотел
Eval как поведение
Почему бы не добавить авто-импорт
Если у нас есть дополнительные словари, которые мы хотим проверить
Нам нужно идти глубже
источник
Для чего стоит, если вам нужно было передать имя функции (или класса) и имя приложения в виде строки, то вы можете сделать это:
источник
handler = getattr(sys.modules[__name__], myFnName)
Попробуй это. Хотя он по-прежнему использует eval, он использует его только для вызова функции из текущего контекста . Тогда у вас есть реальная функция для использования по вашему желанию.
Основное преимущество для меня в том, что вы получите любые ошибки, связанные с eval, в момент вызова функции. Тогда вы получите только ошибки, связанные с функцией при вызове.
источник
eval
крайней необходимости.getattr(__module__, method_name)
это гораздо лучший выбор в этом контексте.ничто из того, что было предложено, не помогло мне. Я обнаружил это все же.
Я использую Python 2.66
Надеюсь это поможет
источник
self.__getattribute__('title')
self.title
self.__getattribute__('title')
в любом случае не работает (не знаю почему), ноfunc = getattr(self, 'title'); func();
работает. Так что, может быть, лучше использоватьgetattr()
вместо этогоgetattr
вместо этого.Как этот вопрос Как динамически вызывать методы внутри класса, используя присвоение имени метода переменной [duplicate] помеченной как дубликат, как этот, я публикую соответствующий ответ здесь:
Сценарий таков: метод в классе хочет динамически вызывать другой метод в том же классе, я добавил некоторые детали в исходный пример, который предлагает более широкий сценарий и ясность:
источник
Это простой ответ, это позволит вам очистить экран, например. Ниже приведены два примера с eval и exec, которые после очистки будут печатать 0 вверху (если вы используете Windows, измените
clear
наcls
, пользователи Linux и Mac оставьте как есть) или просто выполните его соответственно.источник