关于 py-modernize
py-modernize 是用于更新 Python 项目工具链、语法和配置的技能,适合维护旧有代码库的开发者。它涵盖从 pip 迁移到 uv、升级现代语法、替换弃用 API,以及将配置集中到 pyproject.toml。
主要功能
- 01将依赖管理迁移至 uv
- 02升级至 Python 3.13+ 语法
- 03替换弃用 API 与写法
- 04集中配置到 pyproject.toml
- 05更新 CI/CD 与项目文档
- 06通过 Ruff 和测试验证
适用场景
- 01将现有项目从 pip 改为 uv
- 02整理分散在多个文件的配置
- 03升级旧式类型提示和日期时间 API
- 04现代化后运行检查与测试
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ l-mb/ python-refactoring-skills --skill py-modernize安装后在 Claude Code 中输入/py-modernize确认已加载。
详细介绍
Python 代码库现代化
遵循 Engineering Charter 原则,为 Python 项目升级现代工具、语法和模式。
目标
- 从 pip 迁移到 uv,以加快依赖管理
- 将 Python 语法升级到 3.13+ 的现代模式
- 替换已弃用的 API 和模式
- 将工具更新到当前最佳实践
- 确保 pyproject.toml 是唯一的配置来源
必需工具
全局安装 uv(通过包管理器):sudo zypper install uv 或 pip install --user uv
添加到 [dependency-groups] dev:"pyupgrade"、"ruff"
- uv:快速的软件包安装程序(pip 的替代品)
- pyupgrade:自动将语法升级到更新的 Python 版本
- ruff:支持 UP 规则的现代代码检查工具
权限:先运行 py-quality-setup,以配置 .claude/settings.local.json 并授予所有必需的工具权限。
包管理器:pip → uv
为什么选择 uv?
- 比 pip 快 10-100 倍
- 更好的依赖解析
- 更完善的缓存
- 与 pip 兼容(可直接替换)
- 由 Astral(与 ruff 同一团队)积极开发
迁移工作流
# 1. Verify current setup
cat requirements.txt setup.py setup.cfg pyproject.toml
# 2. Install uv globally (not recommended, ask user to install via package manager)
# curl -LsSf https://astral.sh/uv/install.sh | sh
# 3. Replace venv creation
# OLD: python -m venv venv
uv venv
# 4. Replace pip install
# OLD: pip install -e ".[dev]"
uv pip install -e ".[dev]"
# 5. Replace pip install from requirements.txt
# OLD: pip install -r requirements.txt
uv pip install -r requirements.txt
# 6. Compile requirements (faster dependency resolution)
uv pip compile pyproject.toml -o requirements.txt
# 7. Sync environment (install exactly what's in requirements.txt)
uv pip sync requirements.txt
更新 CI/CD
# .github/workflows/test.yml
# BEFORE
- name: Install dependencies
run: |
python -m venv venv
source venv/bin/activate
pip install -e ".[dev]"
# AFTER
- name: Install uv
uses: astral-sh/setup-uv@v1
- name: Install dependencies
run: |
uv venv
source .venv/bin/activate
uv pip install -e ".[dev]"
更新文档
更新 README.md:
## Development Setup
python -m venv venv
source venv/bin/activate
pip install -e ".[dev]"
## Development Setup
# Install uv if not already installed (via package manager preferred)
# sudo zypper install uv # openSUSE
# or: pip install --user uv
uv venv
source .venv/bin/activate
uv pip install -e ".[dev]"
Python 语法现代化
目标版本
在 pyproject.toml 中设置目标版本:
[project]
requires-python = ">=3.13"
[tool.pyupgrade]
target-version = "py313"
[tool.ruff]
target-version = "py313"
[tool.ruff.lint]
select = ["UP"] # Enable pyupgrade rules
运行语法升级
# Using pyupgrade directly (modifies files in-place)
pyupgrade --py313-plus **/*.py
# Using ruff (shows what would change)
ruff check . --select UP
ruff check . --select UP --fix # Apply fixes
# Verify changes
git diff
# Run tests to ensure functionality preserved
pytest
常见现代化改进
运行 pyupgrade --py313-plus . 或 ruff check . --select UP 以自动升级:
- 类型提示:
List[str]→list[str]、Optional[int]→int | None - 移除
__future__:导入(3.11+ 内置) - 字符串格式化:
%或.format()→ f 字符串 - 类型联合:
Union[int, str]→int | str - 海象运算符:
if x := func():(减少临时变量) - match 语句:替换冗长的 if/elif 链(3.10+)
- Pathlib:用
Path对象替换os.path - 数据类:用
@dataclass替换手动编写的__init__
配置现代化
将 setup.py/setup.cfg/requirements.txt 合并到 pyproject.toml。
注意:完整的 pyproject.toml 配置(包括 ruff、mypy 和 basedpyright)请参阅 py-quality-setup。
基本结构:
[project]
name = "myproject"
version = "1.0.0"
requires-python = ">=3.13"
dependencies = ["requests", "pydantic"]
[build-system]
requires = ["setuptools>=68.0"]
build-backend = "setuptools.build_meta"
之后:rm setup.py setup.cfg; uv pip install -e .; pytest
已弃用模式更新
需要修复的常见弃用项:
collections.Iterable→collections.abc.Iterable(3.3 起弃用,3.10 移除)datetime.utcnow()→datetime.now(UTC)(3.12 起弃用)datetime.utcfromtimestamp()→datetime.fromtimestamp(ts, UTC)(3.12 起弃用)imp模块 →importlib(3.12 移除)typing.List、typing.Dict→list、dict(3.9+)typing.Optional[X]→X | None(3.10+)typing.Union[X, Y]→X | Y(3.10+)
搜索已弃用模式:
# Find deprecated datetime usage
grep -rn "datetime.utcnow\|datetime.utcfromtimestamp" --include="*.py" .
# Find old typing imports
grep -rn "from typing import.*List\|from typing import.*Dict\|from typing import.*Optional" --include="*.py" .
# Find old collections imports
grep -rn "from collections import.*Callable\|from collections import.*Iterable" --include="*.py" .
验证清单
- 使用
uv创建虚拟环境并安装软件包 -
pyproject.toml是唯一的配置来源(没有 setup.py/setup.cfg) - 在 pyproject.toml 中设置了
requires-python = ">=3.13" -
ruff check . --select UP未报告问题(或仅有已接受的例外) - 未使用已弃用的
datetime.utcnow()或datetime.utcfromtimestamp() - 没有旧式类型导入(
List、Dict、Optional、Union) - CI/CD 已更新为使用 uv
- README.md 已更新为基于 uv 的设置说明
- 现代化后所有测试均通过
示例
示例:将 pip 迁移到 uv
1. Check current setup:
- ls -la | grep -E "setup.py|requirements.txt|pyproject.toml"
- cat pyproject.toml
2. Install uv (if not already installed):
- Via package manager: sudo zypper install uv # openSUSE
- Or as user package: pip install --user uv
3. Test uv with current project:
- uv venv
- source .venv/bin/activate
- uv pip install -e ".[dev]"
- pytest (verify all tests pass)
4. Update CI/CD:
- Edit .github/workflows/test.yml
- Replace pip commands with uv
5. Update README:
- Replace pip instructions with uv
6. Commit: "Migrate from pip to uv for dependency management"
示例:将语法现代化到 Python 3.13
1. Update pyproject.toml:
[project]
requires-python = ">=3.13"
2. Run pyupgrade:
pyupgrade --py313-plus **/*.py
3. Review changes:
git diff
# Check: List[X] → list[X], Union[X, Y] → X | Y, etc.
4. Run ruff for additional upgrades:
ruff check . --select UP --fix
5. Verify type checking still works:
mypy .
basedpyright .
6. Run tests:
pytest
7. Commit: "Modernize syntax to Python 3.13+"
示例:完整现代化
1. Migrate to uv (see Example 1)
2. Consolidate configuration:
- Read setup.py and setup.cfg
- Migrate all config to pyproject.toml
- Remove setup.py and setup.cfg
- Verify: uv pip install -e ".[dev]"
3. Modernize syntax (see Example 2)
4. Update deprecated APIs:
- grep -r "from collections import.*Iterable" .
- Replace with collections.abc
- grep -r "datetime.utcnow" .
- Replace with datetime.now(UTC)
5. Final validation:
- ruff check . --select UP (clean)
- pytest (all pass)
- mypy . && basedpyright . (no errors)
6. Update documentation:
- README reflects uv usage
- CONTRIBUTING.md updated
7. Commit: "Modernize codebase: uv, Python 3.13 syntax, pyproject.toml"
相关技能
- 前置条件:py-quality-setup(工具配置)、py-test-quality(语法更改前的安全保障)
- 强制执行:py-git-hooks(通过 ruff UP 规则强制使用现代语法)
- 另请参阅:py-complexity(现代化通常有助于简化代码)
评论
支持 Markdown