返回单行for循环的PEP8约定[关闭]

问题描述 投票:-1回答:3

注意:这是一个常规问题;代码确实有效。那就是说,我正在抛光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比嵌套好,但是我可以返回一个(不那么)单行列表而不会破坏常规吗? 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)]
python conventions pep8
3个回答
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]]]

0
投票

我完全赞同用PEP无法治愈坏代码的观点。

@ juanpa.arrivillaga的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]]

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

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]

-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之后。

© www.soinside.com 2019 - 2024. All rights reserved.