Python 循环返回一行的PEP8约定

Python 循环返回一行的PEP8约定,python,conventions,pep8,Python,Conventions,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(

注:这是一个惯例问题;代码确实有效。这就是说,我正在润色一个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)我知道flat比nested好,但是我能返回这样一个(不是这样)单行列表而不打破惯例吗?2) 如果我真的想将这个beast作为伪一行返回,那么关于空格和括号的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没有明确说明这些长的、多行的列表理解。严格地说,只要你把线的长度保持在较低的水平,你就“很好”

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


我完全赞同这样一个观点,即坏代码不能用PEP治愈

<代码> MGRIFIFY()/<代码> @ Juanga.AcViLaGa是一个很好的解决方案,但是我也会考虑重构数据结构并返回一个Untux[t] [i] [j] < /代码>的元组,并使用一个单独的构造函数来分割<代码>图像< /代码>。 如果一个人不喜欢一行读太多的

[]
,则可以使用一种版本的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]

为什么列表中的t(集合(项目))为
?为什么不首先设置
一个集合…您没有返回一行for循环。您正在返回一个列表。为什么要先创建产品,然后对其进行迭代以查看其项(即由
products.append([prod])创建的sinlge元素列表)
并将它们填充到另一个列表中,然后将它们放入一个集合中…这是一个供代码审阅的问题。看起来您可以将前两组for循环替换为
items=set(产品中的prod的item(Xs,Ys)表示产品中的item)
然后将
列表(set(items))
替换为
items
。为什么
用于列表中的t(set(items))
不仅仅是
对于集合中的t(项目)
OP没有要求更改他的代码,只是格式化了,这并不意味着你不能提出改进建议。我选择了不做。而且不建立列表更有效:
返回[mogrify(t,项目)对于集合中的t(项目)]
并将
项目
设置为一个集合,而不是列表。
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]