为什么我在语法完全有效的行中收到“SyntaxError: invalid syntax”?

Why do I get "SyntaxError: invalid syntax" in a line with perfectly valid syntax?

提问人:Pearl Philip 提问时间:6/16/2014 最后编辑:wjandreaPearl Philip 更新时间:10/6/2023 访问量:1168003

问:

这是代码行:

guess = Pmin+(Pmax-Pmin)*((1-w**2)*fi1+(w**2)*fi2)

Pmin、、Pmaxwfi1fi2

当我从代码中删除该行时,相同的错误出现在下一行代码中,同样是无缘无故的。

def Psat(self, T):
    pop= self.getPborder(T)
    boolean=int(pop[0])
   
    P1=pop[1]
    P2=pop[2]
    if boolean:
        Pmin = float(min([P1, P2]))
        Pmax = float(max([P1, P2]))
        Tr=T/self.typeMolecule.Tc
        w=0.5*(1+scipy.tanh((10**5)*(Tr-0.6)))
        fi1=0.5*(1-scipy.tanh(8*((Tr**0.4)-1)))
        fi2=0.460*scipy.sqrt(1-(Tr-0.566)**2/(0.434**2)+0.494

        guess = Pmin+(Pmax-Pmin)*((1-w**2)*fi1+(w**2)*fi2)   # error here
    
        solution = scipy.optimize.newton(funcPsat,guess, args=(T,self))
python 语法错误

评论

2赞 Pearl Philip 6/16/2014
我发现了错误,前面的一行中缺少一个括号。感谢您的帮助
1赞 wjandrea 3/3/2023
从 Python 3.10 开始,我们得到了更好的错误消息。在本例中,有一个箭头指向左括号。SyntaxError: '(' was never closed
0赞 Karl Knechtel 12/7/2023
我改变了主意,重新打开了 stackoverflow.com/questions/10239668。它足够独特,在这里不应被视为重复。

答:

106赞 paxdiablo 6/16/2014 #1

对于早期版本的 Python(1),可能会在看似正确的一行上报告错误。在这种情况下,您应该尝试注释掉出现错误的行。如果错误移动到下一行,则有两种可能性:

  • 要么行都有问题(第二行被第一行隐藏了);或
  • 上一行有一个问题,正在继续存在。

后者更有可能发生,特别是如果注释掉新的违规行会导致错误再次移动。

例如,考虑如下代码,另存为:prog.py

xyzzy = (1 +
plugh = 7

Python 3.8.10 将在第 2 行报告错误,即使问题显然是由第 1 行引起的:

pax> python3.8 prog.py
  File "prog.py", line 2
    plugh = 7
          ^
SyntaxError: invalid syntax

问题中的代码也存在类似的问题:报告错误的上一行代码的括号不平衡。

注释以使其更清晰:

# open parentheses: 1  2             3
#                   v  v             v
fi2=0.460*scipy.sqrt(1-(Tr-0.566)**2/(0.434**2)+0.494
#                               ^             ^
# close parentheses:            1             2

对此,并没有一个通用的解决方案 - 需要分析和理解代码,以确定应该如何更改括号。


(1) 值得一提的是,Python 3.9 中引入的新 PEG 解析器为改进的错误消息铺平了道路(从 3.10 到 3.12 逐渐改进)。这包括在源代码中正确标识错误所在

pax> python3 prog.py
  File "prog.py", line 1
    xyzzy = (1 +
            ^
SyntaxError: '(' was never closed

评论

0赞 Karl Knechtel 11/25/2023
事实证明,类似的问题可能是由于省略 .这会导致下一行,因为该未缩进的行既不在块内,也不在预期的块内。较新的 Python 版本报告显式调用缺失的块。请注意,它是 SyntaxError 的子类exceptfinallytryIndentationErrortryexceptSyntaxErrorIndentationError
9赞 aaron newland 11/6/2016 #2

你错过了这一行中的一个接近的paren:

fi2=0.460*scipy.sqrt(1-(Tr-0.566)**2/(0.434**2)+0.494

有三个,只有两个.()

评论

0赞 Santosa Sandy 3/28/2017
根据 paxdiablo 的说法,我的情况被归类为“前一行有问题,正在继续存在”。我发现错误的方法是逐行注释代码,直到语法错误暂时消失。我给评论标记的最后一行是导致错误的那一行。
3赞 jbyler 1/10/2019 #3

我遇到了类似的问题,语法错误,我知道不应该是语法错误。就我而言,事实证明 Python 2 解释器正在尝试运行 Python 3 代码,反之亦然;我认为我的 shell 有一个混合了 Python 2 和 Python 3 的 PYTHONPATH。

-3赞 michalmonday 9/30/2020 #4

我注意到,在以下位置使用空格可能会导致无明显原因的无效语法错误:

print(f'{something something}')

Python IDLE 似乎出于某种原因跳转并突出显示第一行的一部分(即使第一行恰好是注释),这具有误导性。

评论

3赞 davesave 6/24/2021
f-string-invalid-syntax-in-python-3-5:stackoverflow.com/questions/55182209/...
0赞 wjandrea 3/3/2023
Python 的错误是否显示了错误的行,或者这只是 IDLE 的事情?无论哪种方式,如果您阅读他们的代码,这与 OP 遇到的问题不同。
0赞 Karl Knechtel 11/25/2023
虽然在这里有显示由其他类型有效语法引起的问题的答案是有意义的,但这是一个示例,其中使用的 Python 版本导致语法无效。从根本上说,这个问题是关于代码由于代码的其他部分而变得无效。