Продолжение строки для понимания списков или выражений генератора в python

Как вы должны разбить очень длинное понимание списка?

[something_that_is_pretty_long for something_that_is_pretty_long in somethings_that_are_pretty_long]

Я также видел, что люди, которые не любят использовать "\" для разрыва линий, но никогда не понимал, почему. В чем причина этого?

Ответ 1

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

отлично работает, поэтому вы можете в значительной степени позаботиться о себе. Я бы предпочел

 [something_that_is_pretty_long
  for something_that_is_pretty_long
  in somethings_that_are_pretty_long]

Причина, по которой \ не очень ценится, заключается в том, что она появляется в конце строки, где она либо не выделяется, либо требует дополнительного заполнения, которое должно быть исправлено при изменении длины строки:/p >

x = very_long_term                     \
  + even_longer_term_than_the_previous \
  + a_third_term

В таких случаях используйте parens:

x = (very_long_term
     + even_longer_term_than_the_previous
     + a_third_term)

Ответ 2

Я не против:

variable = [something_that_is_pretty_long
            for something_that_is_pretty_long
            in somethings_that_are_pretty_long]

В этом случае вам не нужно \. В общем, я думаю, что люди избегают \, потому что это немного уродливо, но также может дать проблемы, если это не последняя вещь на линии (убедитесь, что после нее не пробегает пробел). Я думаю, что гораздо лучше использовать его, чем нет, однако, чтобы сохранить длину вашей линии.

Так как \ не требуется в приведенном выше случае или для выражений в скобках, я на самом деле считаю это довольно редким, что мне даже нужно его использовать.

Ответ 3

Вы также можете использовать несколько отступов в случаях, когда вы имеете дело со списком нескольких структур данных.

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

Обратите внимание, как он также фильтруется в другой список с помощью оператора if. Также полезно использовать оператор if в своей строке.