虚拟环境与最佳实践

翻译整理自 Python Tutorial - Virtual Environments and Packages 与 PEP 8 Style Guide。

1. 为什么需要虚拟环境

不同项目可能依赖同一库的不同版本,全局安装会冲突。虚拟环境隔离每个项目的依赖。

2. 创建虚拟环境

venv(标准库)

python -m venv .venv
.venv\Scripts\activate           # Windows
source .venv/bin/activate         # macOS / Linux

激活后命令行前缀出现 (.venv),python、pip 都指向虚拟环境内的工具。

退出:

deactivate

virtualenv(兼容更多版本)

pip install virtualenv
virtualenv .venv

3. 包管理

pip install requests
pip install -r requirements.txt
pip freeze > requirements.txt
pip uninstall requests
pip install --upgrade requests

更新 pip:

python -m pip install --upgrade pip

4. 现代化工具:uv、poetry

uv(推荐)

Rust 实现,速度极快:

pip install uv
uv venv
uv pip install requests
uv pip compile > requirements.txt

poetry

pip install poetry
poetry new myproject
poetry add requests
poetry install
poetry build

5. 包结构建议

PEP 518 / PEP 517 推荐使用 pyproject.toml 作为项目元数据:

myproject/
├── pyproject.toml
├── README.md
├── src/
│   └── myproject/
│       ├── __init__.py
│       └── core.py
└── tests/

6. 风格规范 PEP 8

  • 缩进 4 空格,不用 Tab
  • 一行 79 字符以内(长语句可换行)
  • 函数与类之间空两行
  • 方法之间空一行
  • 命名规范:
    • 变量函数:lowercase_with_underscore
    • 类:CamelCase
    • 常量:UPPER_CASE
    • 私有:_prefix
# Good
def calculate_total(items):
    return sum(item.price for item in items)

class ShoppingCart:
    pass

使用 black、ruff、flake8 自动格式化与检查:

pip install black ruff
black .
ruff check .

7. 类型注解与 mypy

def add(a: int, b: int) -> int:
    return a + b

from typing import List, Dict, Optional
def f(items: List[int], config: Optional[Dict[str, str]] = None) -> None: ...
pip install mypy
mypy myproject/

Python 3.9+ 可直接用 list[int]、dict[str, int],无需 typing.List。

8. 测试与 CI

pip install pytest
pytest
pytest -v --cov=myproject

CI 配合 pre-commit、black --check、ruff、pytest 在 GitHub Actions 跑。

9. 异步编程 asyncio(3.4+)

import asyncio

async def main():
    await asyncio.sleep(1)
    print("done")

asyncio.run(main())

10. 常见陷阱

  • 可变默认参数共享
  • 闭包延迟绑定
  • is vs ==(小整数缓存)
  • 浮点数比较
  • 文件未关闭
  • None 与 falsy 混淆

小结

掌握虚拟环境、风格规范、类型注解与测试,即具备工业级 Python 工程能力。