6

我正在尝试使用 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很陌生所以不知道发生了什么

4

3 回答 3

4
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() 函数。

于 2018-05-17T12:02:57.630 回答
3

嗯,exec而且eval是邪恶的。当你在一个未净化的字符串上使用它们时,你隐含地接受执行几乎任何 Python 表达式......

但这有不完全相同exec的用法:意味着执行一些代码,而eval将返回一个值。这里正确的方法是:

x = eval(eqn)

无论如何,这不是全局变量的正确用法,因为它仅用于从调用中获取值,因此正确的方法是让函数返回值,因此eval而不是exec.

但请记住:eval邪恶的,所以永远不要在生产代码中使用它

于 2018-05-17T12:15:08.870 回答
0

关于为什么在尝试修改局部变量时它不起作用的问题,这是明确禁止的。 看到这个。

于 2019-09-03T07:26:01.530 回答