如何打破 python 中的一长串链式作业

how to break a long line of chained assignments in python

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

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)

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

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

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 序列的其余部分,但我不知道无限序列有类似的技巧。

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

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