声明溢出多行

时间:2016-04-28 17:23:56

标签: python pep8

PEP8告诉我,最大行长应该是79.这听起来有点像穿孔卡片,我习惯了更长的线条,但是当我学习Python时,我正在努力遵循标准风格。 / p>

考虑这一行:

partsList[r][newPurchaseNotes] += partsList[r+1][newPurchaseNotes]

当缩进4次停止时(每个PEP8使用4个空格的标签),它会溢出。 (如果我使用PEP8下划线分隔符而不是Java风格的混合大小写,那就更糟了。)

如果我把它分成两行:

partsList[r][newPurchaseNotes] 
    += partsList[r+1][newPurchaseNotes]

...这是语法错误(意外缩进)。像这样打破它:

partsList[r][newPurchaseNotes] += 
    partsList[r+1][newPurchaseNotes]

...它也是语法错误(语法无效)。

这是两个明显的解决方案,我都不喜欢:

  • 使用较短的变量名称
  • 使用中间变量将一个语句分成两个:

    s = partsList[r+1][newPurchaseNotes]
    partsList[r][newPurchaseNotes] += s
    

在研究这个论坛时,我确实找到了减少循环和条件的缩进级别的建议。在我的情况下,如果在函数内嵌入一段时间,我就嵌套了。我改变了逻辑以减少if语句的一个级别,但这还不足以使该行保持79个字符。

2 个答案:

答案 0 :(得分:2)

通常,虽然PEP-8需要79个字符的行,但更常用的经验法则是100个字符。

尽管如此,这条特殊的线条似乎相对冗长,并且在两个陈述之间重复了相当多的逻辑。目标是什么?很有可能,给定更多的上下文,这个特定的行可以大大简化。

编辑:代码示例:

因此,目标是基本上合并共享某些属性的订单项。这似乎是使用对象的好方法:

class LineDeduper(object):

    def __init__(self, indices, addition_points):
        self.items = {}
        self.indices = indices
        self.addition_points = addition_points

    def add(self, item):
        mergekey = tuple(item[x] for x in self.indices)
        if mergekey in self.items:
            self.merge(mergekey, item)
        else:
            self.items[mergekey] = item

    def merge(self, key, item):
        for idx, val in enumerate(item):
            if idx in self.addition_points:
                self.items[key][idx] += val

    def to_list(self):
        return [x for x in self.items.values()]

只需初始化相关重复数据删除索引的列表,以及需要一起添加的索引列表,并添加CSV中的每一行。完成后,您可以轻松获得结果。

答案 1 :(得分:1)

Python不使用分号来表示行尾。使用反斜杠表示下一行继续行:

partsList[r][newPurchaseNotes] \
    += partsList[r+1][newPurchaseNotes]

你可以在python中多行中断语句的另一种方法是在括号或括号内发生中断。在您的示例中,您可以打破[]之间的界限,但那真的很难看。

一种可能性是:

partsList[r][newPurchaseNotes] = (
    partsList[r][newPurchaseNotes] +
    partsList[r+1][newPurchaseNotes]
)

我不确定这是否有所改善。