pyupgrade:自动升级 Python 代码语法的工具
pyupgrade:自动升级 Python 代码语法的工具
Python 版本迭代很快,3.8 有了海象运算符,3.9 有了内置泛型,3.10 有了联合类型 |。但老代码库里的写法往往还停留在几年前,手动逐行升级费时费力。
pyupgrade 就是专门解决这个问题的。这个项目目前有 4,094 Star,作者是 asottile。它的核心能力很直接:扫描 Python 代码,自动把旧语法替换成新语法,不改变代码的运行逻辑。

支持的重写规则
pyupgrade 覆盖的语法升级范围很广,从 Python 2 兼容代码到 Python 3.13 的新特性都有。
集合与字典。set([1, 2]) 会改成 {1, 2},dict((a, b) for a, b in y) 会改成 {a: b for a, b in y}。这类改动直接减少代码量,可读性也更好。
字符串格式化。可以把 '%s %s' % (a, b) 和 '{}'.format(a, b) 自动转成 f-string。工具比较保守,如果转换会让表达式变长或更复杂,就不会强行替换。
类型注解重写。PEP 585 的 List[str] 改成 list[str],PEP 604 的 Optional[str] 改成 str | None,PEP 696 的 Generator[int, None, None] 改成 Generator[int],都能自动处理。
super() 简化。Python 3 里 super(C, self).f() 可以直接写成 super().f(),pyupgrade 会统一做这种替换。
去除兼容层。如果项目确定只支持 Python 3,pyupgrade 可以删除 six 库的兼容代码、__future__ import、冗余的 io.open 调用,以及 __metaclass__ = type 这类在新版本里不需要的声明。
标准库 API 更新。比如 stdout=subprocess.PIPE, stderr=subprocess.PIPE 改成 capture_output=True,@functools.lru_cache(maxsize=None) 改成 @functools.cache,datetime.timezone.utc 改成 datetime.UTC。这些细微的 API 变化,单独改很琐碎,交给工具批量处理更合适。

使用方式
安装和运行都很简单:
pip install pyupgrade
pyupgrade --py38-plus myfile.py
--py38-plus 表示目标 Python 版本是 3.8 以上,工具会据此决定哪些重写规则可以应用。支持对单个文件或整个目录批量处理。
更推荐的做法是配置成 pre-commit hook。在 .pre-commit-config.yaml 里加上几行配置,每次提交代码时自动运行,代码库的语法标准会始终保持在设定版本上。
适用场景
维护老旧 Python 项目的团队,如果想逐步迁移到新语法,pyupgrade 能省掉大量重复劳动。它只改语法形式,不动业务逻辑,风险很低。
新项目也可以把它集成到 CI 里,防止旧写法进入代码库。配合 black、isort 这类格式化工具一起用,代码风格和质量都能统一管起来。
总之,语法升级这种机械劳动,交给自动化工具更合适。
浙公网安备 33010602011771号