Why do I get "SyntaxError: invalid syntax" in a line with perfectly valid syntax?
python, syntax-error
Solution
For earlier versions of Python(1), an error may reported on a line that appears to be correct. In that case, you should try commenting out the line where the error appears to be. If the error moves to the next line, there are two possibilities:
- Either both lines have a problem (and the second was hidden by the first); or
- The previous line has a problem which is being carried forward.
The latter is more likely, especially if commenting out the new offending line causes the error to move again.
For example, consider code like the following, saved as `prog.py`:
xyzzy = (1 +
plugh = 7
Python 3.8.10 will report an error on line 2, even though the problem is clearly caused by line 1:
pax> python3.8 prog.py
File "prog.py", line 2
plugh = 7
^
SyntaxError: invalid syntax
The code in your question has a similar problem: the code on the previous line to the reported error has unbalanced parentheses.
Annotated to make it clearer:
# 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
There isn't really a general solution for this - the code needs to be analyzed and understood, in order to determine how the parentheses should be altered.
(1) For what it's worth, the new PEG parser introduced in Python 3.9 paved the way for much improved error messages (gradually improving from 3.10 thru 3.12). This includes correctly identifying in the source code where the error is:
pax> python3 prog.py
File "prog.py", line 1
xyzzy = (1 +
^
SyntaxError: '(' was never closed
Problem
This is the line of code: ``` guess = Pmin+(Pmax-Pmin)*((1-w**2)*fi1+(w**2)*fi2) ``` `Pmin`, `Pmax`, `w`, `fi1` and `fi2` have all been assigned finite values at this point, so why is there an error? When I remove that line from the code, the same error appears at the next line of code, again for no apparent reason. ``` 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)) ```