Компиляция / exec не может присвоить значения в своей области видимости, что приводит к внутренней синтаксической ошибке - PullRequest
1 голос
/ 05 ноября 2019

Мой питон делает что-то странное. Я пытаюсь выполнить немного кода из строковой формы, используя exec / eval / compile. В частности, exec, но он молча терпит неудачу из-за синтаксической ошибки, поэтому я переключился на eval.

#start of document

print( compile( 'Test_val = 1;', 'None', 'eval' ) )

Traceback (most recent call last):
  File "/Users/lucasyoung/Desktop/Application/__init__.py", line 6, in <module>
    print( compile( 'Test_val = 1;', 'None', 'eval' ) )
  File "None", line 1
    Test_val = 1;
             ^

Я провел небольшое тестирование и могу, например, вызвать оператор print через compile. Я могу вызывать переменные в существование, но я не могу назвать их. И что странно, это то, что это находится в пределах контекста собственного контекста скомпилированного кода.

Я знаю, что в стеке настаивают на гипер-детализации вопросов, но я, честно говоря, просто не знаю, что сказать об этом,Exec должен запустить некоторый код из строки. Код, который я звоню, совершенно действителен. Я в тупике.

1 Ответ

3 голосов
/ 05 ноября 2019

Во-первых, существует разница между eval () и exec ()

eval (): метод eval () возвращает результат, вычисленный из выражения.

Функция eval выполняетто же самое для одного выражения и возвращает значение выражения:

exec (): exec () не возвращает никакого значения, он возвращает None.

Функция exec (котораябыл оператор в Python 2) используется для выполнения динамически созданного оператора или программы:

поэтому

eval('Test_val = 1;') не является допустимым выражением для eval.

exec('test_val = 1;') является допустимым выражением для exec

, поскольку в вашем случае вы должны использовать

print( compile( 'Test_val = 1;', 'None', 'exec' ) )

, пожалуйста, отметьте В чем разница между eval, exec и compile? длябольше информации

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...