返回单行 for 循环的 PEP8 约定
PEP8 convention for returning one-line for-loop
注:这是一道约定俗成的题;代码 确实 有效。也就是说,我正在抛光 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))]
所以我有 2 个问题:1) 我知道扁平比嵌套好,但是我也可以 return 像这样的(不那么)单行列表而不违反约定 多少? 2) 如果我确实想 return 这个野兽作为伪单行,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)]
由于该行超过 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。
据我所知,PEP8 没有明确解决这些冗长的多行列表推导。严格来说,只要你把行长拉小,你就是"fine".
但是你看,我会像避免瘟疫一样避免编写这样的代码。玩代码高尔夫很有趣,但编写可读、可维护的代码却不是。这就是 PEP8 的 重点。在我们的工具箱中编写可读、可维护代码的第一件事是使用 functions.
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]]]
我完全赞同不能用 PEP 修复错误代码的观点。
mogrify()
@juanpa.arrivillaga 是一个很好的出路,但我也会考虑重构数据结构和 return 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]
注:这是一道约定俗成的题;代码 确实 有效。也就是说,我正在抛光 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))]
所以我有 2 个问题:1) 我知道扁平比嵌套好,但是我也可以 return 像这样的(不那么)单行列表而不违反约定 多少? 2) 如果我确实想 return 这个野兽作为伪单行,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)]
由于该行超过 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。
据我所知,PEP8 没有明确解决这些冗长的多行列表推导。严格来说,只要你把行长拉小,你就是"fine".
但是你看,我会像避免瘟疫一样避免编写这样的代码。玩代码高尔夫很有趣,但编写可读、可维护的代码却不是。这就是 PEP8 的 重点。在我们的工具箱中编写可读、可维护代码的第一件事是使用 functions.
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]]]
我完全赞同不能用 PEP 修复错误代码的观点。
mogrify()
@juanpa.arrivillaga 是一个很好的出路,但我也会考虑重构数据结构和 return 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]