Получить функцию из строки, содержащей полное имя
У меня есть строка вроде:
str = "pwd.getpwuid(1000)"
Теперь, если я попытаюсь eval(), то это может вызвать исключение, потому что я еще не импортировал pwd (или, возможно, нет, если у меня есть).
Поэтому я решил написать парсер, который: разбивает эту строку на "." и получить список:
lis = ["pwd", "getpwuid(1000)"]
затем взять lis[0]
, если он не содержит "("
или же ")"
Я звоню
importlib.import_module(lis[0])
а затем снова Eval.
Могу ли я сделать то же самое лучше?
2 ответа
Решение
Нашел решение:
Я должен изменить строки, содержащие тело функции:
str = "(lambda x: __import__('pwd').getpwuid(x))(1000)"
eval () это нормально!
(лямбда или деф явно одно и то же)
Как насчет разделения позиционных аргументов функции в lis[2] и именованных аргументов в lis[3] с некоторым регулярным выражением и выполнением
lib = importlib.import_module(lis[0])
lib.__dict__[lis[1]](*list[2],**list[3])