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


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

[something_that_is_pretty_long for something_that_is_pretty_long in somethings_that_are_pretty_long]

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

3 84

3 ответа:

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

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

 [something_that_is_pretty_long
  for something_that_is_pretty_long
  in somethings_that_are_pretty_long]

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

x = very_long_term                     \
  + even_longer_term_than_the_previous \
  + a_third_term

в таких случаях, используйте скобки:

x = (very_long_term
     + even_longer_term_than_the_previous
     + a_third_term)

Я не против:

variable = [something_that_is_pretty_long
            for something_that_is_pretty_long
            in somethings_that_are_pretty_long]

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

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

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

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 в свою собственную строку.