【问题标题】:PEP8 convention for returning one-line for-loop [closed]返回单行for循环的PEP8约定[关闭]
【发布时间】:2019-02-20 06:32:13
【问题描述】:

注意:这是一个约定俗成的问题;代码确实工作。也就是说,我正在打磨 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)]

【问题讨论】:

  • 为什么是for t in list(set(items))?为什么不首先将items 设置为一组...
  • 您没有返回单行 for 循环。您正在返回一个列表。
  • 为什么要先创建产品,然后对其进行迭代以检查其项目(即由products.append([prod]) 创建的单个元素列表并将它们填充到另一个列表中,然后将它们放入一个集合中...
  • 这是一个代码审查问题
  • 看起来你可以用items = set(item for prod in product(Xs,Ys) for item in prod)替换你的前两组for循环,然后用items替换list(set(items))

标签: python conventions pep8


【解决方案1】:

据我所知,PEP8 并未明确解决这些冗长的多行列表理解。严格来说,只要你把 line-length 降下来,你就“没问题”了。

但是看,我会像避免瘟疫一样避免这样的代码。玩代码高尔夫很有趣,但不适合编写可读、可维护的代码。这就是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]]]

【讨论】:

  • 并且建立一个列表更有效:return [mogrify(t, item) for t in set(items)]
  • 并让items 成为一个开头的集合......而不是一个列表。
【解决方案2】:

由于该行超过 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。

【讨论】:

  • 为什么for t in list(set(items))不仅仅是for t in set(items)
  • OP 没有要求更改他的代码,只是格式化
  • 这并不意味着您不能提出改进建议。
  • 我选择不这样做。
【解决方案3】:

我完全同意 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]

【讨论】:

    猜你喜欢
    • 2014-09-08
    • 1970-01-01
    • 2015-04-24
    • 1970-01-01
    • 2011-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多