【问题标题】:how to break a long line of chained assignments in python如何在python中打破一长串链式赋值
【发布时间】:2019-03-29 21:49:18
【问题描述】:

我有一长串这样的链式作业:

long_variable_name = another_long_name = a_third_name = some_func()

我想在不使用续行符\ 的情况下打破它。通常我通过使用额外的括号来做到这一点,例如

result = (some_long_func(), some_other_long_func(), some_third_func(),
          some_fourth_func())

我看不到如何给链式赋值加上括号,因为这些语法无效:

a = b = (c = 1)
a = b = c (= 1)

有没有什么方法可以在不使用续行符的情况下打破一长串的链式赋值?

【问题讨论】:

  • 这似乎是一个矛盾的术语:你想继续这一行,但不使用 Python 的行继续语法。您为什么要避免为此目的而提供的语言工具?
  • 括号不起作用,因为这是创建子表达式(第二次尝试)或元组(第一次尝试)的语法。
  • @Prune 我猜你可能会说 Python 与其自己的设计原则不一致(这里更喜欢隐式与显式)但引用 PEP8 “包装长行的首选方法是使用 Python 内部的隐含行延续括号、方括号和大括号。通过将表达式包裹在括号中,可以将长行分隔为多行。应优先使用这些行,而不是使用反斜杠来续行。"
  • 我没有看到不一致之处,但我认为您作为用户的观点。语言定义为我们提供了如何继续一行的优先级。 “复合声明”不适合其中任何一个。但是,我(还)不明白为什么你想要一个配对的外壳来排除行尾延续。从用户的角度来看,我可以比现有的实现更容易地争论“你”的一面。从解析器的角度来看,我可以更好地论证设计者的立场——语法空间在语法的那个点是拥挤的。
  • 这里没有深刻的推理:) 几年前我刚读过 PEP8 中的那一段,从那以后就不需要换行符了!因为这是我第一次认为我可能需要一个,所以我想检查我是否错过了在我的示例中没有 `` 的跨越多行的方法。答案是肯定的“不”,所以我很高兴,我认为接受的答案很好地概述了选择。

标签: python coding-style pep8


【解决方案1】:

作为单个语句,没有要括起来的子表达式。我不喜欢显式续行,但这可能是它看起来最不坏的情况(可能是因为变量名称可能仍然比您可能要中断的其他行短)。

long_variable_name = \
    another_long_name = \
    a_third_name = some_func()

我不知道你是否想把函数调用单独放在一行上。

如果您真的想避免显式换行,我建议您首先不要链接分配。

long_variable_name = some_func()
another_long_name = long_variable_name
a_third_name = long_variable_name

您可以尝试元组解包。 IMO 看起来有点骇人听闻,但是...

(long_variable_name,
 another_long_name,
 a third_name) = (some_func(),)*3

以更多的运行时开销为代价,您可以使用itertools.repeat

from itertools import repeat

(long_variable_name,
 another_long_name,
 a third_name) = repeat(some_func(), 3)

虽然这两种方法都让您指定要分配的变量的数量。尽管您可以在元组解包期间将 finite 序列的其余部分捕获到一个 catch-all 变量中,但我不知道无限序列的类似技巧。

# Good
v1, v2, v3, *rest = repeat(some_func(), 100)

# Bad - infinite loop
v1, v2, v3, *rest = repeat(some_func())

【讨论】:

  • 谢谢,只是想确保我没有错过更清洁的方法!
猜你喜欢
  • 2011-06-13
  • 2015-11-28
  • 2011-01-04
  • 1970-01-01
  • 2012-12-12
  • 1970-01-01
  • 2013-10-12
相关资源
最近更新 更多