web-dev-qa-db-fra.com

Continuation de ligne pour les listes de compréhension ou les expressions de générateur dans python

Comment êtes-vous censé briser 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 également vu quelque part que les gens qui n'aiment pas utiliser '\' pour rompre les lignes, mais n'ont jamais compris pourquoi. Quelle est la raison derrière cela?

98
sasker
[x
 for
 x
 in
 (1,2,3)
]

fonctionne bien, donc vous pouvez faire à peu près ce que vous voulez. Je préfère personnellement

 [something_that_is_pretty_long
  for something_that_is_pretty_long
  in somethings_that_are_pretty_long]

La raison pour laquelle \ n'est pas très apprécié car il apparaît à la fin d'une ligne, où il ne se démarque pas ou a besoin d'un remplissage 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)
134
Fred Foo

Je ne m'oppose pas à:

variable = [something_that_is_pretty_long
            for something_that_is_pretty_long
            in somethings_that_are_pretty_long]

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

Puisque \ 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.

22
Dan Breen

Vous pouvez également utiliser plusieurs retraits 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 à l'aide d'une instruction if. La suppression de l'instruction if sur sa propre ligne est également utile.

19
MrOodles