назначение в exec в Python - PullRequest
0 голосов
/ 17 мая 2018

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

# this functions gets called when Enter is pressed
def etrp(self):
    eqn =  self.sender().text()                  #I get string like '23+4'
    eqn1 = "{0} = {1}".format("global x",eqn)    #I make it x = 23+4
    x = 0
    exec(eqn1)                                   # I get error here
    print(x)
    #some code .....

Когда я пытаюсь запустить его без глобала, он запускается без ошибки, но x остается равным 0, и если я запускаю его так, я получаю эту ошибку: -

qt5ct: using qt5ct plugin
global x = 12+32
Traceback (most recent call last):
  File "/home/orayan/Development/Python/Calculator/calculator.py", line 11, in etrp
    exec(eqn1)
  File "<string>", line 1
    global x = 12+32
             ^
SyntaxError: invalid syntax
[1]    19185 abort (core dumped)  ./main.py

Я очень новичок в Python, поэтому не могу понять, что происходит

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Хм, exec и eval - зло.Когда вы используете их в необработанной строке, вы косвенно соглашаетесь выполнить почти любое выражение Python ...

Но это не совсем то же самое использование: exec предназначено для выполнения некоторого кода, тогда как evalвернет значение.Вот правильный путь:

x = eval(eqn)

Это неверное использование глобальной переменной в любом случае, потому что она используется только для получения значения из вызова, поэтому правильный способ - использовать функцию длявернуть значение, следовательно eval вместо exec.

Но помните: eval есть зло , поэтому никогда не используйте это в производственном коде .

0 голосов
/ 17 мая 2018
global x = 5

не является допустимым кодом Python.

Если вы хотите назначить глобальную переменную x, вы должны написать

global x
x = 5

Попробуйте изменить код как

global x
eqn1 = "{0} = {1}".format("x",eqn)
x = 0
exec(eqn1, globals())

Чтобы изменить глобальные переменные с помощью exec, вам необходимо использовать функцию globals () .

EDIT: добавить функцию globals ().

...