在Python(3.11)中,为什么在f字符串中使用赋值表达式("walrus运算符")时需要用括号括起来?

例如:

#!/usr/bin/env python

from pathlib import Path

import torch


DEVICE = torch.device("cuda" if torch.cuda.is_available() else "cpu")

ckpt_dir = Path("/home/path/to/checkpoints")

_ckpt = next(ckpt_dir.iterdir())
print(_ckpt)
sdict = torch.load(_ckpt, map_location=DEVICE)

model_dict = sdict["state_dict"]

for k, v in model_dict.items():
    print(k)
    print(type(v))
    print(_shape := v.size())
    print(f"{(_numel := v.numel())}")
    print(_numel == torch.prod(torch.tensor(_shape)))

上面包含print(f"{_numel := v.numel()}")的代码块不会进行解析.

那么解析/AST创建要求这样做呢?

推荐答案

此行为在赋值表达式的original PEP中明确指定(也称为海象运算符).

这样做的原因是为了保持与formatted string literals的向后兼容性.在添加赋值表达式之前,您已经可以编写像f"{x:=y}"这样的f字符串,这意味着"使用格式规范=y的格式x".

-报价PEP 572 – Assignment Expressions:

F字符串中的赋值表达式需要圆括号.示例:

>>> f'{(x:=10)}'  # Valid, uses assignment expression
'10'
>>> x = 10
>>> f'{x:=10}'    # Valid, passes '=10' to formatter
'        10'

这表明f字符串中看起来像赋值运算符的东西并不总是赋值运算符.F字符串解析器使用:来指示格式选项.为了保持向后兼容性,f字符串中的赋值运算符的用法必须用括号括起来.如上所述,不推荐使用赋值运算符.

Python相关问答推荐

三个给定的坐标可以是矩形的点吗

运行回文查找器代码时发生错误:[类型错误:builtin_index_or_system对象不可订阅]

ModuleNotFound错误:没有名为flags.State的模块; flags不是包

* 动态地 * 修饰Python中的递归函数

AES—256—CBC加密在Python和PHP中返回不同的结果,HELPPP

numpy.unique如何消除重复列?

Pandas:计算中间时间条目的总时间增量

重置PD帧中的值

ruamel.yaml dump:如何阻止map标量值被移动到一个新的缩进行?

从旋转的DF查询非NaN值

循环浏览每个客户记录,以获取他们来自的第一个/最后一个渠道

当单元测试失败时,是否有一个惯例会抛出许多类似的错误消息?

如何求相邻对序列中元素 Select 的最小代价

如何获得3D点的平移和旋转,给定的点已经旋转?

没有内置pip模块的Python3.11--S在做什么?

你能把函数的返回类型用作其他地方的类型吗?'

使用np.fft.fft2和cv2.dft重现相位谱.为什么结果并不相似呢?

用0填充没有覆盖范围的垃圾箱

使用pythonminidom过滤XML文件

使用元组扩展字典的产品挑战