Continuação de linha para compreensões de lista ou expressões geradoras em python


102

Como você deve quebrar uma compreensão de lista muito longa?

[something_that_is_pretty_long for something_that_is_pretty_long in somethings_that_are_pretty_long]

Eu também vi em algum lugar pessoas que não gostam de usar '\' para quebrar as falas, mas nunca entenderam por quê. Qual é a razão por trás disso?


Respostas:


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

funciona bem, então você pode fazer o que quiser. Eu pessoalmente prefiro

 [something_that_is_pretty_long
  for something_that_is_pretty_long
  in somethings_that_are_pretty_long]

O motivo pelo qual \não é muito apreciado é que aparece no final de uma linha, onde não se destaca ou precisa de preenchimento extra, que deve ser corrigido quando o comprimento da linha muda:

x = very_long_term                     \
  + even_longer_term_than_the_previous \
  + a_third_term

Nesses casos, use parênteses:

x = (very_long_term
     + even_longer_term_than_the_previous
     + a_third_term)

47
Especificamente, as quebras de linha são ignorados dentro quaisquer suportes - (), []e {}.

23

Não me oponho a:

variable = [something_that_is_pretty_long
            for something_that_is_pretty_long
            in somethings_that_are_pretty_long]

Você não precisa \neste caso. Em geral, acho que as pessoas evitam \porque é um pouco feio, mas também pode causar problemas se não for a última coisa na linha (certifique-se de que nenhum espaço em branco o siga). Eu acho que é muito melhor usá-lo do que não, no entanto, para manter os comprimentos de linha baixos.

Visto que \não é necessário no caso acima, ou para expressões entre parênteses, eu realmente acho bastante raro precisar usá-lo.


20

Você também pode usar vários recuos nos casos em que estiver lidando com uma lista de várias estruturas de dados.

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 como ele também filtra em outra lista usando uma instrução if. Largar a instrução if em sua própria linha também é útil.


1
Gosto particularmente desta resposta, pois mostra vários aspectos convencionais da quebra de linha, incluindo a compreensão de listas aninhadas para forloops.
gustafbstrom
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.