¿Por qué aparece "SyntaxError: sintaxis no válida" en una línea con sintaxis perfectamente válida?

Resuelto Pearl Philip asked hace 10 años • 4 respuestas

Esta es la línea de código:

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

PminA , Pmax, wy fi1a fi2todos se les han asignado valores finitos en este punto, entonces, ¿por qué hay un error?

Cuando elimino esa línea del código, aparece el mismo error en la siguiente línea de código, nuevamente sin motivo aparente.

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))
Pearl Philip avatar Jun 16 '14 12:06 Pearl Philip
Aceptado

Para versiones anteriores de Python (1) , se puede informar un error en una línea que parece ser correcta. En ese caso, debería intentar comentar la línea donde parece estar el error. Si el error pasa a la siguiente línea, existen dos posibilidades:

  • O ambas líneas tienen un problema (y la segunda quedó oculta por la primera); o
  • La línea anterior tiene un problema que se está llevando adelante.

Esto último es más probable , especialmente si comentar la nueva línea infractora hace que el error vuelva a moverse.

Por ejemplo, considere un código como el siguiente, guardado como prog.py:

xyzzy = (1 +
plugh = 7

Python 3.8.10 informará un error en la línea 2, aunque el problema está claramente causado por la línea 1:

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

El código de su pregunta tiene un problema similar: el código de la línea anterior al error informado tiene paréntesis desequilibrados.

Anotado para que quede más claro:

# 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

Realmente no existe una solución general para esto: es necesario analizar y comprender el código para determinar cómo se deben modificar los paréntesis.


(1) Por si sirve de algo, el nuevo analizador PEG introducido en Python 3.9 allanó el camino para mensajes de error mucho mejores (mejorando gradualmente desde 3.10 hasta 3.12). Esto incluye identificar correctamente en el código fuente dónde está el error:

pax> python3 prog.py
  File "prog.py", line 1
    xyzzy = (1 +
            ^
SyntaxError: '(' was never closed
paxdiablo avatar Jun 16 '2014 05:06 paxdiablo

Te falta un par cercano en esta línea:

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

Son tres (y sólo dos ).

aaron newland avatar Nov 05 '2016 23:11 aaron newland