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

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)
Fred Foo
fuente
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.

Dan Breen
fuente
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.

MrOodles
fuente
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