我曾尝试使用海豹运算符进行多次赋值,还看到了StackOverflow上的this等问题,也无法使用海豹运算符来赋值多个变量,我只是想知道成功的多重赋值应该是什么样子的,或者是否不可能。
这样做的目的是为我的库mvdef添加支持,以便在mvdef.src.ast_util模块的
通过运行
如果必须猜测,我会认为如果可能的话,
如果有人知道在Python源代码中查找特定部分以告诉我这是否可能,那将非常有帮助,谢谢!顺便说一句,从查看通过的initial commit提供的
这样做的目的是为我的库mvdef添加支持,以便在mvdef.src.ast_util模块的
find_assigned_args
函数中检测所有分配的变量名。通过运行
ast.parse
,我可以看到:=
运算符生成一个ast.NamedExpr
节点,它具有一个.target
属性,该属性是一个ast.Name
对象,我可以从对象的.id
属性中获取分配的名称。如果必须猜测,我会认为如果可能的话,
.target
属性将是ast.Name
对象的列表,而不是单个ast.Name
对象,然而,我似乎无法得到这方面的例子,这让我怀疑它是否不可能,至少现在是这样(在这种情况下,我可以简化我的代码,不只是猜测实现应该是什么)。如果有人知道在Python源代码中查找特定部分以告诉我这是否可能,那将非常有帮助,谢谢!顺便说一句,从查看通过的initial commit提供的
Lib/test/test_parser.py
测试用例来看,似乎没有使用海象运算符进行多重赋值的示例,因此我暂时假设这是不可能的(但如果我错了,请发表意见!)def test_named_expressions(self):
self.check_suite("(a := 1)")
self.check_suite("(a := a)")
self.check_suite("if (match := pattern.search(data)) is None: pass")
self.check_suite("[y := f(x), y**2, y**3]")
self.check_suite("filtered_data = [y for x in data if (y := f(x)) is None]")
self.check_suite("(y := f(x))")
self.check_suite("y0 = (y1 := f(x))")
self.check_suite("foo(x=(y := f(x)))")
self.check_suite("def foo(answer=(p := 42)): pass")
self.check_suite("def foo(answer: (p := 42) = 5): pass")
self.check_suite("lambda: (x := 1)")
self.check_suite("(x := lambda: 1)")
self.check_suite("(x := lambda: (y := 1))") # not in PEP
self.check_suite("lambda line: (m := re.match(pattern, line)) and m.group(1)")
self.check_suite("x = (y := 0)")
self.check_suite("(z:=(y:=(x:=0)))")
self.check_suite("(info := (name, phone, *rest))")
self.check_suite("(x:=1,2)")
self.check_suite("(total := total + tax)")
self.check_suite("len(lines := f.readlines())")
self.check_suite("foo(x := 3, cat='vector')")
self.check_suite("foo(cat=(category := 'vector'))")
self.check_suite("if any(len(longline := l) >= 100 for l in lines): print(longline)")
self.check_suite(
"if env_base := os.environ.get('PYTHONUSERBASE', None): return env_base"
)
self.check_suite(
"if self._is_special and (ans := self._check_nans(context=context)): return ans"
)
self.check_suite("foo(b := 2, a=1)")
self.check_suite("foo(b := 2, a=1)")
self.check_suite("foo((b := 2), a=1)")
self.check_suite("foo(c=(b := 2), a=1)")
:=
的左侧参数必须是标识符,不能是其他任何东西。如果你所说的“多重赋值”是指元组解包(a, b = ...
),那么它是不被允许的。 - chepner