Line continuation for list comprehensions or generator expressions in python

这么长的列表内涵怎么分啊?

[something_that_is_pretty_long for something_that_is_pretty_long in somethings_that_are_pretty_long]

我还看到有些地方的人不喜欢用“分割线”, 但从来不明白为什么。这背后的原因是什么?

43360 次浏览
[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
]
]

Notice how it also filters onto another list using an if statement. Dropping the if statement to its own line is useful as well.

我认为在这种情况下不应该使用列表内涵,而应该使用 for循环:

result = []
for something_that_is_pretty_long in somethings_that_are_pretty_long:
result.append(something_that_is_pretty_long)

One reason to use list comprehensions over a for loop + .append() is that it can be much more concise than using an explicit for loop. However, when the list comprehension needs to be split over multiple lines, that conciseness can make the expression extremely difficult to read.

While PEP8 doesn't explicitly forbid multi-line list comprehensions, the Google Python 风格指南 requires that each portion of a list comprehension fit on a single line (emphasis mine):

2.7理解与生成表达

可以用于简单的情况。映射表达式,用于子句,筛选表达式。不允许使用多个 for 子句或筛选器表达式。当事情变得更复杂时使用循环