如何在python中打破一长串的链接分配

时间:2019-03-29 21:49:19

标签: python coding-style pep8

我有一长串这样的链接分配:

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)

有没有办法在不使用换行符的情况下中断一长串的链接分配?

1 个答案:

答案 0 :(得分:2)

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

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())