gpt4 book ai didi

python - 通过 walrus := operator? 进行多次分配

转载 作者:行者123 更新时间:2023-11-30 21:53:43 25 4
gpt4 key购买 nike

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

这样做的目的是添加对检测我的库中所有分配的变量名称的支持 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中的测试用例(via),似乎没有海象运算符多重赋值的例子,所以我现在假设这是不可能的(但如果我错了,请插话!)

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 - 通过 walrus := operator? 进行多次分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59567172/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com