Для более ранних версий Python(1) в строке, которая кажется правильной, может сообщаться ошибка. В этом случае вам следует попробовать закомментировать строку, в которой, по-видимому, ошибка. Если ошибка переходит на следующую строку, есть две возможности:
Либо в обеих строках есть проблема (и вторая была скрыта первой); или
В предыдущей строке есть проблема, которая переносится вперед.
Последнее более вероятно, особенно если закомментирование новой строки-нарушителя приводит к повторному перемещению ошибки.
Например, рассмотрим код, подобный следующему, сохраненный как prog.py:
xyzzy = (1 + plugh = 7
Python 3.8.10 сообщит об ошибке в строке 2, даже если проблема явно вызвана строкой 1:
Код в вашем вопросе имеет аналогичную проблему: код в строке, предшествующей сообщенной ошибке, имеет несбалансированные круглые скобки.
Аннотировано, чтобы было понятнее:
# 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
Я столкнулся с аналогичной проблемой, с синтаксической ошибкой, которая, как я знал, не должна быть синтаксической ошибкой. В моем случае оказалось, что интерпретатор Python 2 пытался запустить код Python 3, или наоборот; Я думаю, что в моей оболочке был PYTHONPATH со смесью Python 2 и Python 3.
Ответ 4
Я заметил, что недопустимая синтаксическая ошибка без видимой причины может быть вызвана использованием пробела в:
print(f'{something something}')
Кажется, что Python IDLE по какой-то причине переходит и выделяет часть первой строки (даже если первая строка является комментарием), что вводит в заблуждение.