【问题标题】:What's the correct PEP8 practice for this long Python line?对于这条长长的 Python 行,正确的 PEP8 做法是什么?
【发布时间】:2013-03-20 14:59:34
【问题描述】:

我应该如何分解这条线以使其遵守 PEP8?

    assert (sum(map(lambda x: len(x), 
                    (activities,apps,classes,users,verbs))) ==
            Object.query
                  .filter(Object.status != ObjectStatusChoices.DELETED)
                  .count())

【问题讨论】:

  • 嗯,首先你应该将lambda x: len(x) 替换为len。 :)
  • PEP-8's maximum line length section 有什么不清楚的地方?
  • 真的,我想大多数人会说将其分成多行并命名中间值(甚至将片段重构为函数并命名它们 ),此时原始问题变得毫无意义。
  • @DogukanTufekci lambda x: len(x) 是一个函数对象,它接受一个参数(我们将调用x)并返回len(x)len 是一个函数对象,它接受一个参数(我们将调用 x)并返回 len(x)。尝试同时执行 sum(map(lambda x: len(x), (a,b,c)))sum(map(len, (a,b,c))) - 它们是相同的。
  • map() 将函数应用于每个元素,lambda 只是一种创建函数的方法。试试我评论中的两个例子,看看。

标签: python python-2.7 pep8


【解决方案1】:

如果您将内容重写为单独的行,则永远不会出现这种情况。

它还可以让你给中间值起有意义的名字(我不得不猜测,但大概你知道它们),甚至可以将一些逻辑重构为函数(你可以给有意义的名字)。

例如,不更改任何逻辑,甚至重写任何逻辑(除了使用len 代替lambda x: len(x)):

lengths = map(len, (activities,apps,classes,users,verbs))
db_query = Object.query.filter(Object.status != ObjectStatusChoices.DELETED)
assert sum(lengths) == db_query.count()

【讨论】:

  • 这种方法的一个小问题是,如果你使用python -O 运行,它会删除断言,这仍然会创建lengthsdb_query 列表,然后忽略它们(在这种情况下,它可能不会命中数据库,但仍然没有必要)。并不是说任何人都应该使用python -O,但值得注意的是。
  • @Dougal:好点。当然,解决方案很明显:将整个检查移到一个函数中,然后 assert check_lengths()(这也意味着您可以将其设为可重用的后置条件或不变量等)。
【解决方案2】:

首先,请记住,对此没有单一的“正确 PEP8 答案”。我更喜欢:

in_mem = sum(len(x) for x in (activities,apps,classes,users,verbs))
in_db = Object.query.filter(
                        Object.status != ObjectStatusChoices.DELETED
                        ).count()
assert in_mem == in_db

如果您发现自己的语句需要分成五行,那么您可能需要更多语句。

【讨论】:

  • PEP-8 建议将第 4 行缩进以匹配括号或仅缩进一个块,并将第 5 行移动到第 4 行的末尾。
  • 虽然可能是这样,但该问题确实明确要求 PEP-8,并且大多数其他程序员都希望遵循它。 PEP-8 的重点是制定一个一致的标准,因为人们总是会有不同的偏好。这是通过始终如一的方式对他人有礼貌。
  • 实际上,在重新检查 PEP8 时,我没有看到任何我违反的明确建议。 PEP-8 实际上很少提及如何打破长行。
  • 连续行应该垂直对齐被包裹的元素,或者使用 Python 的隐式行在括号、括号和大括号内连接,或者使用悬挂缩进。使用悬挂缩进时,应考虑以下因素;第一行不应该有任何参数,并且应该使用进一步的缩进来清楚地将自己区分为续行。 - 你缩进太远,第 4 行下面没有块,这意味着该行应该有进一步的缩进- 请参阅 PEP-8 的该部分中的示例。如果该行没有块,则缩进一次,如果有,则缩进两次。
  • 我认为,当每个示例都显示以特定方式完成的某件事时,它的精神是什么就很清楚了。我没有看到随机数量的额外缩进如何使这变得不那么可读?这是关于一致性 - 很高兴知道应该在哪里寻找下一段代码,并且遵循给定的样式会使这更容易。
猜你喜欢
  • 2020-02-23
  • 1970-01-01
  • 2016-04-23
  • 1970-01-01
  • 2015-08-20
  • 1970-01-01
  • 2010-11-27
  • 1970-01-01
相关资源
最近更新 更多