Continuación de línea para listas por comprensión o expresiones generadoras en Python


102

¿Cómo se supone que vas a dividir una lista de comprensión muy larga?

[something_that_is_pretty_long for something_that_is_pretty_long in somethings_that_are_pretty_long]

También he visto en algún lugar a personas a las que no les gusta usar '\' para dividir líneas, pero nunca entendieron por qué. Cuál es la razón detrás de esto?


Respuestas:


143
[x
 for
 x
 in
 (1,2,3)
]

funciona bien, así que puedes hacer prácticamente lo que quieras. Yo personalmente preferiría

 [something_that_is_pretty_long
  for something_that_is_pretty_long
  in somethings_that_are_pretty_long]

La razón por la \que no se aprecia mucho es que aparece al final de una línea, donde no se destaca o necesita un relleno adicional, que debe arreglarse cuando cambian las longitudes de las líneas:

x = very_long_term                     \
  + even_longer_term_than_the_previous \
  + a_third_term

En tales casos, use parens:

x = (very_long_term
     + even_longer_term_than_the_previous
     + a_third_term)

47
Específicamente, los saltos de línea se ignoran dentro de los corchetes - (), []y {}.

23

No me opongo a:

variable = [something_that_is_pretty_long
            for something_that_is_pretty_long
            in somethings_that_are_pretty_long]

No es necesario \en este caso. En general, creo que la gente lo evita \porque es un poco feo, pero también puede dar problemas si no es lo último en la línea (asegúrese de que no haya espacios en blanco a continuación). Sin embargo, creo que es mucho mejor usarlo que no, para mantener la longitud de las líneas bajas.

Dado \que no es necesario en el caso anterior, o para expresiones entre paréntesis, en realidad me parece bastante raro que incluso necesite usarlo.


20

También puede hacer uso de múltiples sangrías en los casos en que esté tratando con una lista de varias estructuras de datos.

new_list = [
    {
        'attribute 1': a_very_long_item.attribute1,
        'attribute 2': a_very_long_item.attribute2,
        'list_attribute': [
            {
                'dict_key_1': attribute_item.attribute2,
                'dict_key_2': attribute_item.attribute2
            }
            for attribute_item
            in a_very_long_item.list_of_items
         ]
    }
    for a_very_long_item
    in a_very_long_list
    if a_very_long_item not in [some_other_long_item
        for some_other_long_item 
        in some_other_long_list
    ]
]

Observe cómo también se filtra a otra lista usando una declaración if. También es útil soltar la instrucción if en su propia línea.


1
Me gusta particularmente esta respuesta, ya que muestra varios aspectos convencionales del salto de línea, incluida la comprensión de listas anidadas para forbucles.
gustafbstrom
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.