2016-04-28 73 views
1

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语句的一个级别,但仅仅保留79个字符是不够的。

+0

你最初没有得到代码格式文本的原因是因为你给它的缩进表示它是上述要点的延续。它需要缩进_even more_ – SpoonMeiser

+0

谢谢。我注意到这个问题已经消失了(更多缩进添加,关于为什么没有格式化的评论被删除)当我去编辑它。那是怎么发生的?除我以外的其他人可以编辑文本吗? –

+0

是的,任何有足够代表权的人都可以编辑它,但如果它们没有实际的改进,编辑将被检查并可能回滚 – SpoonMeiser

回答

1

Python不使用分号来表示行结束。使用反斜杠来指示行持续到下一行:

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

的另一种方式,你可以在python打破声明多行,就是如果突破括号或括号内发生。在你的例子中,你在可能打破[]之间的界限,但那真的很丑。

一种可能性是:

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

我不知道,这是一个进步,但。

+0

我知道Python不使用;像C语句的结尾。反斜杠是一个合理的解决方案,但它并不优雅。当然有更好的? –

+0

我通过解释_why_您使用反斜线来打破一行来提到分号:其他语言要求您划分_every_行。其他方法在python中有有效的换行符在括号或括号内。我会给我的答案添加一个例子。 – SpoonMeiser

+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添加的每一行。完成后,您可以轻松获得结果。

+0

我通过合计数量(此处未显示)并将两项购买历史记录合并为一个字符串来合并两条记录的信息。我的数据来自读取到2d列表中的CSV文件。 我没有看到冗余,也没有看到一种方法来简化它,除了使用中间变量,这似乎对我来说很丑。 –

+1

目标是总结表中_all_项的数量,或者仅仅是这两个项目? –

+0

我正在合并两个或多个具有相同内容的记录,以用于两个特定的信息字段(而不是这里讨论的两个)。 –