如何在python中打破一长串链式赋值

问题描述 投票:-1回答:1

我有很长的链式任务,如下所示:

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 coding-style pep8
1个回答
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

你可以试试元组拆包。它看起来有点hackish 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)

虽然这两种方法都可以指定分配的变量数量。虽然你可以在元组解包期间捕获catch-all变量中有限序列的剩余部分,但我不知道无限序列的类似技巧。

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

# Bad - infinite loop
v1, v2, v3, *rest = repeat(some_func())
© www.soinside.com 2019 - 2024. All rights reserved.