考虑这一行:
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个字符。
答案 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]
)
我不确定这是否有所改善。