Python 后端开发入门:从基础语法到可测试的服务
本文目录
Python 适合脚本、数据处理、自动化和 API 服务,但会写几行脚本不等于已经会维护后端。本文面向熟悉 JavaScript/React 的开发者,从可验证的语言基础走到输入校验、模块边界、测试与部署;不绑定 FastAPI、Django 或某个模型供应商。
0. 先确认解释器和项目隔离
在本机核对 python3 --version 很重要:本次设备检查显示默认 python3 是 3.9.6。Python 3.9 已于 2025-10-31 结束支持;它仍可复跑旧练习,但不应作为新服务的安全运行时。新项目从 Python.org 选择当前受支持的稳定版本,并在 CI、开发机和部署环境明确版本范围。升级解释器前先确认依赖是否提供对应平台的 wheel。
每个项目建立独立环境,不向系统 Python 全局安装依赖:
python3 -m venv .venv
source .venv/bin/activate
python -m pip install -U pip
python -m pip install pytest
python -m pytest
Windows PowerShell 激活命令是 .venv\Scripts\Activate.ps1。把 .venv/ 加入 .gitignore,不要把虚拟环境目录提交或复制到另一台电脑;环境应能从项目清单重新创建。应用依赖需要锁定和审查,不能把一次 pip freeze 的输出自动当成经过验证的依赖策略。
1. 从 JavaScript 心智模型迁移
Python 用缩进界定代码块,elif 对应 else if;None 对应“没有值”,比较时通常写 value is None。列表 list 类似可变数组,字典 dict 保存键值映射,元组适合固定序列,集合适合去重和成员判断。dict.get(key) 在缺少键时返回 None 或默认值;如果 None 本身也是合法值,要用显式 sentinel 或先检查 key in mapping,不要把“缺失”和“值为空”混为一谈。
bool 是 int 的子类,所以 isinstance(True, int) 为真。处理 API 数字字段时,若业务不接受布尔值,需要单独拒绝。空列表、空字典、空字符串和数字 0 都是假值;这和 JavaScript 的真值规则不完全相同,迁移条件表达式时应写出想表达的语义。
2. 函数、类型提示与真正的边界校验
用纯函数表达规则,让同一输入得到同一输出;类型提示改善编辑器和静态检查,但 Python 运行时默认不会替你验证注解。HTTP JSON、命令行参数、文件内容和消息队列数据仍需运行时校验:检查类型、范围、长度、允许集合和业务状态,再交给领域逻辑。
from dataclasses import dataclass
import math
from typing import List, Optional
@dataclass(frozen=True)
class Reading:
value: float
status: str
def parse_number(raw: object) -> float:
if isinstance(raw, bool) or not isinstance(raw, (int, float)):
raise ValueError('reading must be a number')
value = float(raw)
if not math.isfinite(value):
raise ValueError('reading must be finite')
return value
def classify_reading(raw: object) -> Reading:
value = parse_number(raw)
status = 'danger' if value > 7 else 'warning' if value > 3 else 'safe'
return Reading(value=value, status=status)
def append_event(name: str, events: Optional[List[str]] = None) -> List[str]:
if events is None:
events = []
events.append(name)
return events
不要用 events=[] 当可变默认参数:默认对象会在多次调用间复用。用 None 并在函数内新建列表。dataclass 便于表达进程内的数据结构,但它不是 JSON schema、数据库实体或权限校验器;持久化和外部输入仍需明确的转换与约束。
3. 异常只在能处理的边界捕获
ValueError 表示值形状不符合预期,KeyError 常表示键不存在,OSError 覆盖一类操作系统 I/O 故障。只捕获当前层可以恢复、转换为稳定 API 响应或补充上下文的异常;不要用 except Exception: pass 把程序错误伪装成成功。记录日志时保留请求 ID 和安全的错误类型,不写认证头、密码、完整敏感正文或环境变量。
用 with open(...) 管理文件生命周期;读 JSON 可使用标准库 json,对解码后的对象仍要验证 schema。写临时文件时考虑原子替换、权限、磁盘上限和进程中断后的清理。路径由用户输入时不要直接拼接到可信目录,先做资源授权和路径约束。
4. 模块组织和测试
从一个小而清晰的结构开始:app/ 放应用代码,tests/ 放测试;领域规则不要依赖 Web 框架对象。只有在路由、业务、存储和外部服务已有不同变化原因时再拆层,避免为了“看起来像企业项目”制造空壳目录。模块导入应尽量没有启动服务器、读秘密、改数据库或执行网络请求等副作用;命令行入口放在 if __name__ == '__main__': 保护下。
用单元测试覆盖边界值和失败路径,再用集成测试验证数据库、队列、文件系统和 HTTP 适配器。下面的参数化测试可以覆盖合法数值、布尔值、字符串、NaN 和无穷大:
import math
import pytest
from app.domain import parse_number
@pytest.mark.parametrize('raw, expected', [(0, 0.0), (3.5, 3.5)])
def test_parse_number_accepts_finite_numbers(raw, expected):
assert parse_number(raw) == expected
@pytest.mark.parametrize('raw', [True, '3.5', math.nan, math.inf])
def test_parse_number_rejects_invalid_values(raw):
with pytest.raises(ValueError):
parse_number(raw)
测试名称应描述行为;避免只断言函数被调用或 mock 返回值。数据库事务、并发唯一约束、上传临时文件清理和权限判断需要各自的集成/契约测试,不能由几条纯函数单测代替。
5. 什么时候才需要 async
async/await 适合在受支持的异步框架和客户端中并发等待网络、数据库或其他 I/O;它不会自动让 CPU 密集计算变快,也不能把同步阻塞库包装成 async def 就称为非阻塞。先画出请求依赖图并测量延迟,再决定同步处理、异步任务队列、线程或进程池。后台任务还要处理超时、重试、幂等、取消和进程重启。
6. 从练习进到可维护服务的检查单
- 固定受支持的 Python 版本,隔离依赖并在干净环境重建;提交项目配置与锁定文件,不提交
.venv或凭据。 - 把外部输入解析为明确类型;类型提示不是运行时校验,权限和资源归属必须在服务端确认。
- 数据库查询使用驱动/ORM 参数绑定并明确事务边界;不要把用户输入拼进 SQL 字符串。
- 将纯业务逻辑与 HTTP、数据库、文件、模型 API 分开;错误转换集中在边界层。
- 测试正常值、边界值、并发和失败清理;日志脱敏,指标避免写入个人数据和高基数原文。
- 发布前运行格式检查、静态类型检查、单元/集成测试、依赖审计和迁移演练;部署后检查健康、资源和回滚路径。
本机的 Python 练习目前证明字典、条件/循环等基础代码可以运行;函数练习文件仍只有题目,不能把它写成已掌握 Web 服务、异步系统或生产部署。学习时应先把每个例子跑通并写测试,再逐步接一个最小 API 和持久化层。
中文延伸阅读
- Python 官方教程(简体中文):从语言基础延伸到模块、异常、类和标准库;网址中的
3指向当前 Python 3 文档,具体语法与新版本仍需对照项目所用解释器版本。 - 廖雪峰 Python 教程:适合作为循序渐进的中文入门教材,和本文的服务端工程边界互补。跟读时仍需核对 Python 版本、依赖版本和当前官方文档;不要把教程示例直接当成生产配置。
- 阮一峰 JavaScript 教程(网道):适合回顾 JavaScript 语言与 DOM 基础。该教程主要按 ES5 与传统浏览器 API 组织;学习现代前端时,还要补充 ES modules、Promise/async、现代浏览器 API、TypeScript 以及框架当前文档。
- 阮一峰旧版 JavaScript 教程迁移说明:旧站说明内容已迁移到网道,收藏时优先使用上面的现行入口。
官方资料
- Python Tutorial:语言控制流、数据结构、模块、I/O、错误处理和类。
- Python
venv:虚拟环境的创建、隔离和激活。 - Python
typing:类型提示语义;注解不会自动成为运行时校验。 - Python 3.9.25 release notice:Python 3.9 支持生命周期与停止安全更新的说明。
- pytest documentation:测试发现、断言、参数化和 fixtures。
示例按 Python 3.9 语法编写以便复现本机练习,不代表 3.9 仍适合作为新项目运行时。Python 版本、第三方依赖和框架 API 会演进,部署前应重新核对官方支持周期及锁定版本文档。
Live Notes
留言提交后会先进入审核,审核通过后对其他读者公开。