Multiple assignments via walrus := operator?(通过海象进行多个赋值:=运算符?)
问题描述
我曾尝试使用walrus运算符进行多个赋值,并在StackOverflow上看到了类似this的问题,它也无法使用walrus运算符为多个变量赋值,我只是想知道成功的多重赋值是什么样子,或者它是否不可能。
这样做的目的是添加对检测我的库mvdef(特别是在mvdef.src.ast_util
模块中的find_assigned_args
函数内)中所有分配的变量名的支持。
通过运行ast.parse
,我可以看到:=
运算符产生了一个ast.NamedExpr
节点,它有一个.target
属性,它是一个ast.Name
对象,我可以从该对象的.id
属性中获取分配的名称。
如果一定要我猜测的话,我会假设如果它是可能的,.target
属性将是一个ast.Name
对象的列表,而不是单个ast.Name
对象,然而,我似乎无法得到一个这样的例子,这让我怀疑这是否是不可能的,至少目前是这样(在这种情况下,我可以简化我的代码,而不仅仅是猜测实现应该是什么)。
如果有人知道要查看Python源代码的哪个特定部分来告诉我这是否可能,那将非常有帮助,谢谢!
附注-从initial commit(via)中提供的Lib/test/test_parser.py
中的测试用例来看,似乎没有使用walrus操作符进行多重赋值的示例,所以我现在假设这是不可能的(但如果我错了,请插话!)
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中所示:
# Equivalent needs extra parentheses
loc = x, y # Use (loc := (x, y))
info = name, phone, *rest # Use (info := (name, phone, *rest))
# No equivalent
px, py, pz = position
name, phone, email, *other_info = contact
这篇关于通过海象进行多个赋值:=运算符?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:通过海象进行多个赋值:=运算符?
基础教程推荐
- 使 Python 脚本在 Windows 上运行而不指定“.py";延期 2022-01-01
- 将 YAML 文件转换为 python dict 2022-01-01
- 合并具有多索引的两个数据帧 2022-01-01
- 如何在 Python 中检测文件是否为二进制(非文本)文 2022-01-01
- 使用Python匹配Stata加权xtil命令的确定方法? 2022-01-01
- 使用 Google App Engine (Python) 将文件上传到 Google Cloud Storage 2022-01-01
- Python 的 List 是如何实现的? 2022-01-01
- 哪些 Python 包提供独立的事件系统? 2022-01-01
- 症状类型错误:无法确定关系的真值 2022-01-01
- 如何在Python中绘制多元函数? 2022-01-01