语句溢出不止一行

statement spilling over more than one line

PEP8 告诉我最大行长度应该是 79。这听起来有点像穿孔卡片,我习惯了更长的行,但是当我学习 Python 时,我正在努力符合到标准样式。

考虑这一行:

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

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

如果我像这样把它分成两行:

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

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

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

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

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

在研究这个论坛时,我确实找到了减少循环和条件语句缩进级别的建议。在我的例子中,我有 if nested in if nested in a while inside a function。我更改了逻辑以减少一级 if 语句,但仍不足以将这一行保持在 79 个字符内。

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

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

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

一种可能是:

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

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

通常,虽然 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 中的每一行。完成后,你可以很容易地得到结果。