Использование exe c () для получения экземпляров классов - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть класс, и мне нужно использовать строковый ввод для его создания, и я слышал о exec(), поэтому я попытался использовать его, и я вставил строку правильно, но это дает мне ошибки, это exec строка:

exec(" ".join(args[2:])).toString()

Первые 2 части списка не имеют значения. Я отладил эту строку только для того, чтобы убедиться, что она правильная, и даже попытался жестко закодировать ее, и она сработала, но этого не произошло, когда я использовал exec.

Что с этим не так и как я могу сделать это правильно ?

Оценивая все комментарии:)

Редактировать:

Я получаю ошибку AttributeError, говорящую, что это NoneType, хотя, если я просто жестко закодирую ее, отлично работает.

1 Ответ

0 голосов
/ 27 апреля 2020

Решение 1: вместо передачи выражения Python либо используйте подкоманды argparse, либо определите свой собственный легко разбираемый мини-язык. Вы можете хранить соответствующие классы и функции в файле dict, чтобы получать их из строк (лучше, чем полагаться на globals, так как он позволяет вносить в белый список только то, что вы хотите выставить)

Решение 2: использовать всю мощь Модуль ast для синтаксического анализа выражения Python в ast, а затем записи собственных посетителей для безопасной оценки ast.

Решение 3: продолжайте использовать exec или eval и подождите, пока какой-нибудь сценарий не появится ie стирает весь жесткий диск или хуже.

...