Получить функцию из строки, содержащей полное имя

У меня есть строка вроде:

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])
Другие вопросы по тегам