Python Asignar valor a la variable durante la condición en while Loop

Una simple pregunta sobre la syntax de Python. Quiero asignar un valor de una función a una variable durante la condición de un bucle while. Cuando el valor devuelto por la función es falso, el bucle debería interrumpirse. Sé cómo hacerlo en PHP.

while (($data = fgetcsv($fh, 1000, ",")) !== FALSE) 

Sin embargo, cuando bash una syntax similar en Python, aparece un error de syntax.

No puedes usar la asignación en una expresión. La asignación es en sí misma una statement, y no puede combinar declaraciones de Python.

Esta es una elección explícita hecha por los diseñadores de lenguaje; es demasiado fácil usar accidentalmente uno = y asignar, donde pretendías usar dos == y probar la igualdad.

Mueva la asignación al bucle, o asigne antes del bucle, y asigne nuevos valores en el propio bucle.

Para su ejemplo específico, el módulo csv Python le brinda una API de nivel superior y en su lugar estaría haciendo un bucle sobre el csv.reader() :

 with open(csvfilename, 'rb') as csvfh: reader = csv.reader(csvfh) for row in reader: 

Rara vez , si alguna vez, necesito asignar en una construcción de bucle. Por lo general, hay una (mucho) mejor manera de resolver el problema en cuestión.

No puedes hacer eso en Python, ninguna asignación en expresiones. Al menos eso significa que no escribirá accidentalmente == en lugar de = o al revés y tendrá que trabajar.

El estilo tradicional de Python es solo para usar mientras que True y break:

 while True: data = fgetcsv(fh, 1000, ",") if not data: break # Use data here 

Pero hoy en día lo pongo en un generador:

 def data_parts(fh): while True: data = fgetcsv(fh, 1000, ",") if not data: break yield data 

de modo que en el código que utiliza el archivo, la fealdad se oculta:

 for data in data_parts(fh): # Use data here 

Por supuesto, si lo que estás haciendo es leer CSV, usa el módulo csv.

Escribí un pequeño módulo de Python, al que llamo let , que te permite realizar una asignación de variable en cualquier lugar donde se permita una función.

Instálalo así:

 pip install let 

Creo que lo siguiente logrará lo que estás buscando:

 from let import let while let(data = fgetcsv(fh, 1000, ',')): # Do whatever you'd like with data here 

Sin embargo … el comentario de Duncan sobre la pregunta original que dice que usar iter es interesante. No estaba al tanto de la función hasta que lo mencionó, y ahora creo que puede ser una solución mejor que la mía. Es discutible: iter requiere que se proporcione explícitamente un centinela, mientras que a la mía no le importa y simplemente espera que fgetcsv devuelva cualquier valor False y.