我正在尝试使用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的新手所以无法弄清楚最新情况
答案 0 :(得分:2)
嗯,exec
和eval
是邪恶的。当你在非清理字符串上使用它们时,你隐含地接受执行几乎任何Python表达式......
但是这些用法并不完全相同:exec
用于执行某些代码,而eval
则返回一个值。这里的正确方法是:
x = eval(eqn)
这不是对全局变量的正确用法,因为它仅用于从调用中获取值,因此正确的方法是让函数返回值,因此eval
代替{ {1}}。
但请记住:exec
evil 所以从不在生产代码中使用。
答案 1 :(得分:1)
global x = 5
是无效的python代码。
如果要分配全局变量x
,则应编写
global x
x = 5
尝试将代码更改为
global x
eqn1 = "{0} = {1}".format("x",eqn)
x = 0
exec(eqn1, globals())
要使用exec修改全局变量,您需要使用globals()函数。
编辑:添加globals()函数。
答案 2 :(得分:0)
关于为什么在尝试修改局部变量时它不起作用的问题,特别禁止这样做。 See this.