用于返回单行 for 循环的 PEP8 约定



注意:这是一个约定问题;代码确实有效。也就是说,我正在完善一个 8 个月的项目,但无法找出以下样式的最佳方法:

def foo(Xs, Ys, image):
products = []
for prod in product(Xs,Ys):
products.append([prod])
items = []
for comb in products:
for item in comb:
items.append(item)
return [[[t[1][0], t[0][0]],
image[t[1][0]:t[1][1],
t[0][0]:t[0][1]]] 
for t in list(set(items))]

所以我有两个问题:1)我知道平面比嵌套更好,但是我可以在不违反太多约定的情况下返回这样的(不那么)单行列表吗?2)如果我确实想将这只野兽作为伪单行返回,关于空格和括号的PEP8约定是什么?

编辑:代码中的第二个循环是出于调试原因,我完全忘记将其取出。糗。

它更新为:

def foo(Xs, Ys, image):
products = []
for prod in product(Xs,Ys):
products.append(prod)
return [[[t[1][0], t[0][0]],
image[t[1][0]:t[1][1],
t[0][0]:t[0][1]]] 
for t in set(products)]

据我所知,PEP8 并没有明确地解决这些冗长的多行列表推导。严格来说,只要你把线长放低,你就"没问题"。

但是看,我会像瘟疫一样避免这样的代码。玩代码高尔夫很有趣,但编写可读、可维护的代码就不有趣了。这就是PEP8的重点。在我们的工具箱中,编写可读、可维护的代码的第一件事就是使用函数

def foo(Xs, Ys, image):
products = []
for prod in product(Xs,Ys):
products.append([prod])
items = []
for comb in products:
for item in comb:
items.append(item)
return [mogrify(t, item) for t in list(set(items))]
def mogrify(t, item):
return [[t[1][0], t[0][0]], image[t[1][0]:t[1][1], t[0][0]:t[0][1]]]

由于该行超过 79 个字符,我可能会将其缩进为这样

return [
[
[t[1][0], t[0][0]],
image[t[1][0]:t[1][1], t[0][0]:t[0][1]]
] for t in list(set(items))
]

这是在 PEP8 之后。

我完全支持一个观点,即糟糕的代码无法通过PEP治愈。

mogrify()by @juanpa.arrivillaga 是一个很好的出路,但我也会考虑重构数据结构并返回一个t[i][j]元组,并使用单独的构造函数来切片image

如果一个人反对连续阅读太多[][][][],则有一个版本的mogrify:

def mogrify(t, image):
a = t[1][0]
b = t[0][0]
c = t[0][1]
d = t[1][1]
return [[a, b], image[a:d, b:c]]

另外,我对分离构造函数的想法是:

def corners(Xs, Ys):
# ...
return a, b, c, d
def make_interval(a, b, c, d):
return [a, b]
def slice_image(image, a, b, c, d):
return image[a:d, b:c]