Search code examples
pythonsyntax-error

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


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))

Solution

  • For earlier versions of Python(1), an error may be 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