Вызов встроенной функции со строкой в ​​Python

Я сослался на следующие темы и не думаю, что этот пост является дубликатом какой-либо из них:

  1. Вызов функции модуля по его имени (строке)
  2. Функция вызова Python из строки
  3. Используйте строку для вызова функции в Python

Например, предположим, что у меня есть строка data_type = "int", и я хочу вызвать встроенную функцию int непосредственно со строкой. Кстати, у меня не может быть data_type = int, потому что data_type фактически загружается из файла JSON, т.е. data_type всегда является строкой или None.

Моя лучшая (самая аккуратная) попытка - это eval(data_type)("4"), но, как предполагают люди, eval не кажется хорошим вариантом, и его следует избегать в любом случае.

Альтернативой является создание словаря типа data_type_dic = {"int": int, "float": float} и выполнение data_type_dic[data_type]("4"). Однако создание этого словаря кажется мне «изобретением велосипеда».

Поскольку int - это встроенная функция, а не метод в модуле, getattr кажется неработоспособным. Это тоже не самоопределяемая функция, поэтому locals()[data_type] дает KeyError.

Тогда как лучше всего вызвать встроенную функцию с соответствующей строкой?

Использование dict, как вы сказали, было бы самым скудным решением. Не хочу переборщить

Joshua Nixon 16.07.2018 12:16
{item.__name__:item for item in (int, float)}
Chris_Rands 16.07.2018 13:29
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
522
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Лучше всего по-прежнему словарь, но:

>>> import builtins
>>> getattr(builtins, 'int')
<class 'int'>

Использование dict является здесь разумным решением Только, точка. Не только потому, что это наиболее явное, очевидное, читаемое и обслуживаемое решение, но и потому, что вы определенно хотите иметь полный контроль, когда дело доходит до сопоставления вводимых пользователем данных (всего, что поступает из внешнего мира) с исполняемым кодом (безопасность 101: никогда доверяет пользователю входы).

да +1 за усиление этого, например, getattr(builtins, "quit")(), может быть

Chris_Rands 16.07.2018 12:35

Вы можете получить атрибуты по именам с помощью функции getattr:

getattr(obj, 'attr') == obj.attr

Итак, вы можете использовать:

import builtins
getattr(builtins, 'int')

Но с таким кодом вы получаете в облаке такие вещи, как input или print, поэтому вам следует сделать:

if data_type in ('int',  'float'): 
  getattr(builtins, data_type)
else: 
  raise Exception('...')

Другие вопросы по теме