Python 3.9 新特性:任意表达式可作为装饰器!

Python 3.9 新特性速览 - Ricequant米筐量化 去年国庆假期,Python 社区发布了 3.9 版本的第一个 stable release 。相比于 3.8,Python 3.9 新特性众多,但不少特性与大多数 Python“使用者”(而非 CPython 的贡献者或使用 C 接口编写扩展的开发者)关系不大。本文将站在 Python “使用者”的角度,简单介绍新特性中很可能会与各位的日常开发产生关系的几个。 字典“并集”运算符 “并集”运算符顾名思义就是给两个字典取并,并产生新的字典对象。熟悉 collections 标准库的开发者听到这一特性. 阅读详情

点击上方“编程派”,选择设为“设为星标”

优质文章,第一时间送达!

一个月前(2月20日),一则新的 PEP 没有受到任何阻碍就被官方采纳了,这么快的速度,似乎并不多见。

然而,更为高效率的是,仅在半个月内,它的实现就被合入了代码仓。也就是说,我们最快有望在 3 天后(3月23日)发布的 3.9.0 alpha 5 版本中看到它!

Python 3.9 的发布计划:

这个 PEP 就是 PEP-614:放宽对装饰器的语法限制。

当前装饰器的语法为:

decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE

PEP-614 提议将其简化为:

decorator: '@' namedexpr_test NEWLINE

我已经把 PEP 全文翻译出来了,Github 地址:http://dwz.date/RV9

放宽对装饰器的限制,这对之前的用法没有影响,但至于会带来哪些新的好处,我还不知道有哪些现实的例子。

下面是 PEP 翻译后的核心内容摘录,先跟大家一睹为快吧:

--------------摘录分割线----------------

概要

Python 当前要求所有装饰器都由 dotted name 组成,可选地带一个调用。本 PEP 提议消除这些限制,并允许任何有效的表达式作为装饰器。

(译注:dotted name,指的是装饰器在“@”符号后是“xxx”或“xxx.yyy”这种格式。没有很好地译法,故未译。)

动机

在最初引入装饰器时,Guido表示对其语法作限制是一种偏好,而不是因为技术的要求:

我对此有一种直觉。我不确定它来自哪里,但我就是有……因此,尽管将来将语法更改为 @test 相当容易,但我仍想坚持使用更受限的形式,除非给出了真正的使用 @test 会增加可读性的用例。

尽管在实践中很少遇到问题,但是多年来,BPO问题和邮件列表帖子不断出现,要求去除限制。最近的一封邮件(它促成了本提案)提供了一段很好的使用 PyQt5 库的示例代码,如果放宽现有的限制,它将变得更具可读性、地道性和可维护性。

稍作修改的示例:

buttons = [QPushButton(f'Button {i}') for i in range(10)]

# Do stuff with the list of buttons...

@buttons[0].clicked.connect
def spam():
    ...

@buttons[1].clicked.connect
def eggs():
    ...

# Do stuff with the list of buttons...

当前,这些装饰必须重写成这样(译注:上方是假想的最优写法,但 Python 还不支持,只能用下方的啰嗦写法):

button_0 = buttons[0]

@button_0.clicked.connect
def spam():
    ...

button_1 = buttons[1]

@button_1.clicked.connect
def eggs():
    ...

此外,当前的语法太过宽松,以至于无法将更复杂的装饰器表达式结合在一起。也就是说,当前的限制并没有像预期的那样去禁止任意复杂的表达式,而是使它们变得更丑陋且效率低下:

# Identity function hack:

def _(x):
    return x

@_(buttons[0].clicked.connect)
def spam():
    ...

# eval hack:

@eval("buttons[1].clicked.connect")
def eggs():
    ...

原理

允许任意表达式

在相当长的一段时间内,允许任意有效表达式的决定(而不仅仅是放宽当前的限制,如允许取下标),已被视为装饰器语法发展的下一个顺理成章的步骤。正如Guido 在另一个邮件列表讨论中所说:

我觉得强制约束它没有什么道理,因为它已不再是一个普通的表达式。

若对语法进行特殊设置以允许某些有用的用法,只会使当前情况复杂化,并且几乎能肯定此过程会在将来的某个时间重复。此外,这种语法上的改变的目的之一是阻止使用上述的 eval 和反模式的  identity-function 之类的诱惑。

简而言之:如果要删除一些限制,我们应该删除所有限制。

什么算一个“表达式”

在本文档中,“表达式”一词的用法与《Python语言参考》中定义的相同。可以概括为“任何在 if、elif 和 while 块中测试为有效的内容”。

这与可能更流行的定义稍有不同,后者可以概括为“任何作为有效字符串输入给 eval 的内容”。

前一个“表达式”的定义更方便,因为它非常贴合我们的需求,并且可以重用被现有语言结构所允许的语法。与其它定义相比,它有两个细微的差异:

1、元组必须加括号

这是基于 Guido 在同一封邮件中的洞察。紧接着前面的引述:

但是我不会允许逗号,决不可能赞成这样:

@f, g
def pooh(): ...

确实,它可能甚至导致没有经验的读者得出结论,认为正在使用多个装饰器,就像它们被堆叠了一样。这里要求加括号,可以使意图变得清晰,而无需施加进一步的限制和复杂语法。

2、赋值表达式不需括号

在这里,语法的选择是明确的。PEP 572解释了为什么需要在顶级表达式语句的周围加上括号:

加入此规则是为了简化用户在赋值语句和赋值表达式之间的选择——没有令两者都生效的语法位置。

由于赋值语句在此处无效,因此赋值表达式就不必带括号。

(译注:赋值表达式,即 Assignment Expressions 或 Named Expressions,是 Python 3.8 引入的新特性,就是它引入了新的“:=”海象操作符。)

-----------------正文分割线---------------

PEP 的全文翻译已收录在 Github 的《PEP中文翻译计划》中,目前已有 20+ 篇 PEP 翻译,欢迎感兴趣的同学查阅&参与翻译。

附录:

PEP614英文:https://www.python.org/dev/peps/pep-0614

PEP614中文:http://dwz.date/RV9

PEP中文翻译计划:https://github.com/chinesehuazhou/peps-cn

作者简介:豌豆花下猫,生于广东毕业于武大,现为苏漂程序员,有一些极客思维,也有一些人文情怀,有一些温度,还有一些态度。

回复下方「关键词」,获取优质资源

回复关键词「 pybook03」,立即获取主页君与小伙伴一起翻译的《Think Python 2e》电子版
回复关键词「入门资料」,立即获取主页君整理的 10 本 Python 入门书的电子版
回复关键词「m」,立即获取Python精选优质文章合集
回复关键词「book 数字」,将数字替换成 0 及以上数字,有惊喜好礼哦~
题图:pexels,CC0 授权。

好文章,我在看
python开发的任意表达式计算求值 基于算符优先算符的python开发的任意表达式计算求值类。 支持减号/负号,一符两用机制 支持浮点数、整数、字符串(用一个“开头,仿lisp语法) 支持所有算术运算符,包括**,//, % 支持全部7个比较运算符 支持与或非3个逻辑运算符 支持自定义数学函数(代码中预设sin函数作为示范) 支持外部提供的变量机制 支持外部设置函数(代码中预设isvar函数作为示范) 结构清晰,易于扩展。 具有实用性,同时可以用于学习算符优先算法的功能。 立即下载

相关推荐

Visual MODFLOW Flex 6.1新手入门:从数据导入到3D建模的完整工作流解析

本文为Visual MODFLOW Flex 6.1新手提供了从零开始构建地下水数值模型的完整工作流指南。详细解析了从项目规划、数据准备与导入,到构建三维概念模型、生成并运行数值模型,直至结果可视化与校准的核心步骤。帮助水文地质与环工领域初学者快速掌握这一专业软件,高效完成从数据到三维建模的全过程。

a1b2c的博客 809

python 3.9版本安装教程(超详细)

目录 一,安装3.9版本解释器 二,安装pycharm 社区版 一,安装3.9版本解释器 Install Now会默认下载在C盘,最好不要下载在C盘,箭头指示可选择安装路径 选择安装路径 我选择的是D盘的software文件夹 安装完成然后关闭 二,安装pycharm 社区版 (专门用来编写python代码,可以编写Java代码,但是需要Java环境) 选择安装路径 我选择的是D盘的software文件夹 点击下一步就好,然后直接...

小宝的宝呢的博客 5万+

Nuvoton OpenTitan开源安全芯片技术解析与应用

硬件安全模块(HSM)作为可信计算基的核心组件,其设计透明度和可验证性正成为行业焦点。RISC-V架构凭借开源特性,为构建可审计的安全芯片提供了新范式。OpenTitan项目通过开放Verilog源码和形式化证明,实现了从物理不可克隆函数(PUF)到分层安全启动的全栈透明。该方案在lowRISC Voyager开发板上实测显示,安全启动时间小于200ms,性能损耗仅7%,显著优于传统黑盒方案。目前该技术已应用于Chromebook和数据中心,其40nm工艺版本更将功耗降至5μA待机水平,为物联网和边缘计算提

weixin_36303807的博客 402

Python&PyCharm精通指南

链接过时请私信我。

weixin_55880059的博客 1万+

SMR实战指南:从GWAS数据到eQTL分析的完整流程

本文提供了基于汇总数据的孟德尔随机化(SMR)实战指南,详细解析了如何从GWAS汇总数据出发,整合eQTL数据,完成从数据准备、BESD格式转换到最终SMR与HEIDI分析的完整流程。文章重点阐述了核心操作步骤、常见避坑技巧与结果解读,旨在帮助遗传学研究者高效掌握这一分析基因表达与复杂性状潜在因果关系的强大工具。

weixin_29246195的博客 1071

Podman修改镜像源教程(附最新docker镜像源)

Podman修改镜像源教程(附最新docker镜像源)

道长的博客 4142

【附安装包】Python-3.9.5安装教程

软件:Python版本:3.9.5语言:英文大小:26.9M安装环境:Win11/Win10/Win8/Win7硬件要求:CPU@2.5GHz 内存@2G(或更高)下载通道①百度网盘丨64位下载链接:提取码:6789。

白帽阿叁的博客 2672

oracle19c 无备份情况下重建ocr 和 votedisk

无备份情况下重建ocr 和 votedisk – 19c 备注:测试环境基本上都有ocr自动备份文件,建议参考有备份情况下恢复ocr和votedisk Deconfigure and reconfigure entire cluster will rebuild OCR and Voting Disk, user resources (database, instance, service, ...

fangang001的专栏 4187

1、Python3.9版本官网下载安装教程

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、Python介绍二、安装步骤1.官网下载Python安装包2.Python可视化编辑器 前言 余生平,怎一个懒字了得。 小白Python自动化运维随笔(懒人专属)。 一、Python介绍 Python是一种面对对象的编程语言,应用领域以及相应库非常之多。可以理解成python是一个大工具箱,面对不同场景使用不同工具。目前Python主要分为2.x 和 3.x版本,语法与相应的库有些许差别,后续对于自动化编程使用的pyth.

lishengdong_1995的博客 2万+

避开PSRR仿真三大坑:用Cadence psspxf分析分频器时,这些设置错了白忙活

本文深入探讨了使用Cadence psspxf工具进行分频器PSRR仿真时常见的三大技术陷阱,包括扰动信号参数设置、收敛性优化和后处理信号提取。通过详细的参数推荐和实战技巧,帮助工程师避免仿真误差,提升PSRR分析效率与准确性,特别适用于16分频器等数字-模拟混合电路设计。

weixin_29258297的博客 302

构建可编程记忆系统:OpenClaw-SuperMemory本地部署与智能知识管理实战

在信息过载的时代,高效的知识管理与智能检索成为技术从业者的核心需求。向量数据库与嵌入模型技术通过将文本转化为高维向量,实现了基于语义相似度的智能搜索,突破了传统关键词匹配的局限。这项技术的核心价值在于将静态存储的信息转化为可动态查询和计算的知识资产,极大地提升了信息调用的准确性和效率。其应用场景广泛,从个人笔记管理、对话历史归档到企业知识库构建都能发挥关键作用。本文聚焦于开源项目OpenClaw-SuperMemory,它正是基于这一技术栈,通过本地化部署实现了可编程记忆系统的构建。项目集成了ChromaD

weixin_42525482的博客 320

怎么下载python并安装3.9.0,python下载安装教程3.10.0

如果你也喜欢编程,想通过学习Python转行、做副业或者提升工作效率,我也为大家整理了一份【最新全套Python学习资料】一定对你有用!如果你是零基础小白,想快速入门Python是可以考虑的!1、学习时间相对较短,学习内容更全面更集中2、可以找到适合自己的学习方案Python安装包+激活码、Python web开发,Python爬虫,Python数据分析,人工智能、机器学习等教程,带你从零开始系统性的学好Python!我已经上传至优快云官方,如果需要可以扫描下方二维码。

chatgpt001的博客 1万+

论文阅读:Training language models to follow instructions with human feedback

这篇论文的目标是通过引入一种基于人类反馈的训练方法,来让语言模型更好地按照用户意图行事。这是因为大规模语言模型虽然强大,但有时候会生成不准确、有偏见或者对用户无帮助的内容,这说明它们和用户的需求之间存在一定的“错位”。论文提出了一个新方法,将 GPT-3 进行优化,称为示例数据与监督学习:让人类标注员生成一些正确行为的示例,并使用这些示例来初步优化模型。比较数据与奖励模型:让标注员比较模型生成的多个输出,并将其排序,从中学到模型输出的优劣规则。强化学习优化:基于这些规则,使用强化学习算法进一步优化模型。

CSPhD-winston的博客 1716

Python 3.9 新特性:任意表达式可作为装饰器!不敢相信!

一个月前(2月20日),一则新的 PEP 没有受到任何阻碍就被官方采纳了,这么快的速度,似乎并不多见。 然而,更为高效率的是,仅在半个月内,它的实现就被合入了代码仓。也就是说,我们最快有望在 3 天后(3月23日)发布的 3.9.0 alpha 5 版本中看到它! Python 3.9 的发布计划: 这个 PEP 就是PEP-614:放宽对装饰器的语法限制。 当前装饰器的语法为: ...

爬遍所有网站 265

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Python3.9新特性

Python3.9 相较于之前的版本,主要是新增了字典的合并运算符、放宽了装饰器的语法限制、对于字符串新增了去除前缀后缀的方法、以及 math 模块和 datetime 模块的一些改进,更多的改变

正在努力搬砖人的博客 940

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

python3.9教程_技术揭秘 | Python 3.9 新特性速览

国庆假期,Python 社区发布了 3.9 版本的第一个 stable release。相比于 3.8,Python 3.9 新特性众多,但不少特性与大多数 Python“使用者”(而非 CPython 的贡献者或使用 C 接口编写扩展的开发者)关系不大。本文将站在 Python “使用者”的角度,简单介绍新特性中很可能会与各位的日常开发产生关系的几个。字典“并集”运算符“并集”运算符 顾名思义就...

weixin_35599852的博客 1162

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

python3.9新特性_Python 3.9 新特性速览

国庆假期,Python 社区发布了3.9 版本的第一个 stable release。相比于 3.8,Python 3.9 新特性众多,但不少特性与大多数 Python“使用者”(而非 CPython 的贡献者或使用 C 接口编写扩展的开发者)关系不大。本文将站在 Python “使用者”的角度,简单介绍新特性中很可能会与各位的日常开发产生关系的几个。字典“并集”运算符“并集”运算符顾名思义就是给...

weixin_39967812的博客 177

python 3.9 新特性 简介

目录 字典“并集”运算符 类型提示的改善 装饰器语法更加灵活 classmethod支持包装其他描述器 新增模块、函数、方法 参考资料 字典“并集”运算符 “并集”运算符顾名思义就是给两个字典取并,并产生新的字典对象。 熟悉 collections 标准库的开发者听到这一特性想必很容易联想到 ChainMap,两者的区别是“并集”运算符会直接产生新的对象,而 ChainMap 产生的是与输入的对象相关联的视图——视图对象或输入对象的变化都会直接对对方产生影响。 字典“并集”运算符及其相.

whatday的专栏 706

python新技术_技术揭秘 | Python 3.9 新特性速览

国庆假期,Python 社区发布了 3.9 版本的第一个 stable release。相比于 3.8,Python 3.9 新特性众多,但不少特性与大多数 Python“使用者”(而非 CPython 的贡献者或使用 C 接口编写扩展的开发者)关系不大。本文将站在 Python “使用者”的角度,简单介绍新特性中很可能会与各位的日常开发产生关系的几个。字典“并集”运算符“并集”运算符顾名思义就是...

weixin_39885383的博客 194

python各版本新特性简单梳理

python 语言经历了从 python2 到 pyhton3 的大版本更新,python3 也有了十几次比较大的版本更新,每次更新都有自己的新特性和改进,这里整理一下每次版本更新都有些什么大的变化。

哦豁灬 1万+

Python 3.9 新特性全面总结

Python3.9 带来了一些新语法,| 字典合并运算符,zoneinfo 时区模块标准库时区支持,内置类型直接用于类型标注等。这是 Python 2 兼容层的最后一个版本,collections.Mapping 等别名将在 3.10 彻底消失,建议尽早迁移。

Talk is cheap, show the code. zhangsihui.pythonanywhere.com 177
上一篇: 「4 行代码」实现黑客帝国特效
下一篇: 小姐姐教你用代码画画,真大佬!
codingpy
博客等级 码龄11年 1873粉丝 104原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值