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.cachedatetime.timezone.utc 改成 datetime.UTC。这些细微的 API 变化,单独改很琐碎,交给工具批量处理更合适。

README区域截图

使用方式

安装和运行都很简单:

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 这类格式化工具一起用,代码风格和质量都能统一管起来。

总之,语法升级这种机械劳动,交给自动化工具更合适。

posted @ 2026-06-17 09:13  techfusion55  阅读(19)  评论(0)    收藏  举报