【问题标题】:statement spilling over more than one line语句溢出超过一行
【发布时间】:2016-04-28 17:23:56
【问题描述】:

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 嵌套在 if 嵌套在一个函数内的一段时间内。我更改了逻辑以减少一级 if 语句,但仅将行保持在 79 个字符内是不够的。

【问题讨论】:

  • 你最初没有得到代码格式文本的原因是因为你给它的缩进表明它是上述要点的延续。它需要缩进更多
  • 谢谢。当我进入编辑它时,我注意到问题已经消失(添加了更多缩进,删除了关于为什么它没有格式化的评论)。那是怎么发生的?除了我之外的其他人可以编辑文本吗?
  • 是的,任何有足够代表的人都可以编辑它,但如果没有实际改进,编辑将被审查并可能回滚
  • 再次感谢。显然,我是一个 stackoverflow 新手,也是一个 Python 新手。

标签: python pep8


【解决方案1】:

通常,虽然 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 中的每一行。完成后,您可以轻松获得结果。

【讨论】:

  • 我通过对数量求和(此处未显示)并将两项购买历史记录连接成一个字符串来合并两条信息记录。我的数据来自读入二维列表的 CSV 文件。我看不到冗余,也看不到简化它的方法,除了使用中间变量,这对我来说很难看。
  • 目标是对表中所有项的数量求和,还是仅对这两项求和?
  • 我正在合并两个或多个具有相同内容的两个特定信息字段的记录(不是这里讨论的两个)。
  • @MarkColan - 请参阅上面的代码示例。我认为它应该做你需要的,并且它以 Python 的方式来做。
  • 太棒了!这个例子远远超出了我新手的理解能力,但它看起来像是我学习的下一个地方。非常感谢!
【解决方案2】:

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

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

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

一种可能性是:

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

但我不确定这是否是一种改进。

【讨论】:

  • 我知道 Python 不使用 ;对于像 C 这样的语句结束。反斜杠是一个合理的解决方案,但它并不优雅。肯定有更好的吗?
  • 我提到分号是为了解释为什么你使用反斜杠来换行:其他语言要求你分隔每一行other way 在 python 中具有有效的换行符是在括号或方括号内。我将在我的答案中添加一个示例。
  • 谢谢。第二个建议对我来说似乎更好。
猜你喜欢
  • 2016-02-13
  • 1970-01-01
  • 1970-01-01
  • 2017-09-05
  • 1970-01-01
  • 2017-11-12
  • 2015-06-11
  • 2014-09-03
相关资源
最近更新 更多