PEP8 告诉我最大行长度应该是 79。这听起来有点像打洞卡,而且我习惯了更长的行,但是当我学习 Python 时,我试图符合标准样式。
考虑这一行:
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 嵌套在函数内的 while 中。我更改了逻辑以减少一级 if 语句,但这不足以将行保留在 79 个字符内。
最佳答案
一般来说,虽然 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 中的每一行。完成后,您可以轻松得出结果。
关于python - 语句溢出超过一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36921521/