通过海象进行多个分配:=运算符?

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

我曾尝试使用walrus运算符进行多个赋值,并在StackOverflow上看到了诸如this之类的问题,这些问题也无法使用walrus运算符来赋多个变量,我只是想知道成功的多重赋值是什么样子,或是否不可能。

这样做的目的是增加对在我的库mvdef中(特别是在find_assigned_args模块的find_assigned_args函数内的所有已分配变量名称的检测)的支持。

[从运行mvdef.src.ast_util开始,我可以看到ast.parse运算符产生了一个:=节点,并且它具有一个ast.NamedExpr属性,它是一个.target对象,从中可以从该对象的对象获取分配的名称。 ast.Name属性。

[如果我不得不猜测的话,我假设.id属性将是.target对象的列表,而不是单个ast.Name对象,但是事实是似乎无法得到一个例子,这使我怀疑是否至少在目前暂时是不可能的(在这种情况下,我可以简化我的代码,而不仅仅是猜测实现应该是什么)。

如果有人知道要看Python源代码的哪一部分来告诉我这是否可行,那将很有帮助,谢谢!

P.S。 -通过查看ast.NameLib/test/test_parser.py)中提供的initial commit中的测试用例,似乎没有使用海象运算符进行多次分配的示例,因此我现在假设它不是可能(但是如果我错了,请输入提示音!)

via
python abstract-syntax-tree python-3.8
1个回答
0
投票
可重复打包和解包是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)") =之间的一个区别,只有前者支持它们。如在:=中找到的:

PEP-572

© www.soinside.com 2019 - 2024. All rights reserved.