返回单行for循环的PEP8约定

时间:2018-09-15 21:24:29

标签: 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(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)我知道平面比嵌套更好,但是我可以像这样返回一个(不是这样的)单行列表,而又不会违反惯例吗? 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)]

3 个答案:

答案 0 :(得分:2)

据我所知,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]]]

答案 1 :(得分:0)

我完全支持不能使用PEP修复错误代码的观点。

@ juanpa.arrivillaga的

builder.setOnlyAlertOnce(true) 是一个不错的出路,但我还将考虑重构数据结构并返回mogrify()的元组,并使用单独的构造函数来切片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]]

答案 2 :(得分:-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之后。