Continuation de ligne pour les compréhensions de liste ou les expressions génératrices en python

102

Comment êtes-vous censé rompre une très longue liste de compréhension?

[something_that_is_pretty_long for something_that_is_pretty_long in somethings_that_are_pretty_long]

J'ai aussi vu quelque part des gens qui n'aiment pas utiliser «\» pour briser les lignes, mais qui n'ont jamais compris pourquoi. Quelle est la raison derrière cela?

sasker
la source
3
duplication possible de Comment indenter les listes de compréhension Python?
Cristian Ciupitu

Réponses:

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

fonctionne bien, vous pouvez donc faire ce que vous voulez. Je préférerais personnellement

 [something_that_is_pretty_long
  for something_that_is_pretty_long
  in somethings_that_are_pretty_long]

La raison pour laquelle ce \n'est pas très apprécié est qu'il apparaît à la fin d'une ligne, où il ne se démarque pas ou nécessite un rembourrage supplémentaire, qui doit être corrigé lorsque la longueur des lignes change:

x = very_long_term                     \
  + even_longer_term_than_the_previous \
  + a_third_term

Dans de tels cas, utilisez des parens:

x = (very_long_term
     + even_longer_term_than_the_previous
     + a_third_term)
Fred Foo
la source
47
Plus précisément, les sauts de ligne sont ignorées à l' intérieur des parenthèses - (), []et {}.
23

Je ne suis pas opposé à:

variable = [something_that_is_pretty_long
            for something_that_is_pretty_long
            in somethings_that_are_pretty_long]

Vous n'avez pas besoin \dans ce cas. En général, je pense que les gens évitent \parce que c'est légèrement moche, mais peuvent aussi poser des problèmes si ce n'est pas la toute dernière chose sur la ligne (assurez-vous qu'aucun espace ne le suit). Je pense que c'est bien mieux de l'utiliser que non, cependant, afin de réduire la longueur de vos lignes.

Comme ce \n'est pas nécessaire dans le cas ci-dessus, ou pour les expressions entre parenthèses, je trouve en fait assez rare que je doive même l'utiliser.

Dan Breen
la source
20

Vous pouvez également utiliser plusieurs indentations dans les cas où vous avez affaire à une liste de plusieurs structures de données.

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
    ]
]

Remarquez comment il filtre également sur une autre liste en utilisant une instruction if. Déposer l'instruction if sur sa propre ligne est également utile.

MrOodles
la source
1
J'aime particulièrement cette réponse, car elle montre plusieurs aspects conventionnels du saut de ligne, y compris la compréhension de liste imbriquée pour les forboucles.
gustafbstrom