Вопрос-Ответ

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

Почему я получаю "SyntaxError: недопустимый синтаксис" в строке с идеально допустимым синтаксисом?

Это строка кода:

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

Pmin, Pmax, w, fi1 и fi2 всем на данный момент присвоены конечные значения, так почему же возникает ошибка?

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

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))
Переведено автоматически
Ответ 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) Как бы то ни было, новый синтаксический анализатор PEG, представленный в Python 3.9, проложил путь к значительно улучшенным сообщениям об ошибках (постепенно улучшаясь с 3.10 по 3.12). Это включает в себя правильное определение в исходном коде, где ошибка:

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

В этой строке отсутствует близкий параметр:

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

Их три ( и только два ).

Ответ 3

Я столкнулся с аналогичной проблемой, с синтаксической ошибкой, которая, как я знал, не должна быть синтаксической ошибкой. В моем случае оказалось, что интерпретатор Python 2 пытался запустить код Python 3, или наоборот; Я думаю, что в моей оболочке был PYTHONPATH со смесью Python 2 и Python 3.

Ответ 4

Я заметил, что недопустимая синтаксическая ошибка без видимой причины может быть вызвана использованием пробела в:

print(f'{something something}')

Кажется, что Python IDLE по какой-то причине переходит и выделяет часть первой строки (даже если первая строка является комментарием), что вводит в заблуждение.

python