Я сослался на следующие темы и не думаю, что этот пост является дубликатом какой-либо из них:
Например, предположим, что у меня есть строка 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.
Тогда как лучше всего вызвать встроенную функцию с соответствующей строкой?
{item.__name__:item for item in (int, float)}





Использование dict является здесь разумным решением Только, точка. Не только потому, что это наиболее явное, очевидное, читаемое и обслуживаемое решение, но и потому, что вы определенно хотите иметь полный контроль, когда дело доходит до сопоставления вводимых пользователем данных (всего, что поступает из внешнего мира) с исполняемым кодом (безопасность 101: никогда доверяет пользователю входы).
да +1 за усиление этого, например, getattr(builtins, "quit")(), может быть
Вы можете получить атрибуты по именам с помощью функции 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('...')
Использование dict, как вы сказали, было бы самым скудным решением. Не хочу переборщить