主题
第 6 章:社区与文化
"In the end, software is a social activity." — Martin Fowler
一门编程语言不只是语法和编译器。 它是一个社区,一种文化,一套共享的价值观。 Python 之所以成为今天的 Python,不只是因为 Guido 的设计才华, 更是因为一个独特的社区—— 一个既重视技术卓越,又重视人文关怀的社区。
📖 本章内容
Python 之父 Guido van Rossum
🎭 The Drama:一个人如何改变编程世界
1989 年的圣诞假期,荷兰数学与计算机科学研究中心(CWI)的程序员 Guido van Rossum 觉得无聊,决定写一门新语言来打发时间。 他不知道这个"业余项目"会在 35 年后被数百万人使用。
Guido 的背景
Guido van Rossum 的关键经历:
1956 出生于荷兰海牙
1982 阿姆斯特丹大学数学与计算机科学硕士
1982-1986 在 CWI 参与 ABC 语言开发
→ ABC 对 Python 的影响:
├── 缩进代表代码块(ABC 首创!)
├── 高级数据结构(列表、字典)
├── 追求简单、可读
└── 但 ABC 失败了(不可扩展、不能调用 C)
1989 圣诞假期开始写 Python
→ 吸取 ABC 的教训:
├── 保留缩进语法(Guido 坚信这是对的)
├── 但让语言可扩展(模块系统)
├── 能调用 C 代码(实用主义)
└── 开源(不重蹈 ABC 封闭的覆辙)
1991 Python 0.9.0 发布(alt.sources 新闻组)
1994 Python 1.0 发布
2000 Python 2.0 发布
2005 加入 Google(20% 时间用于 Python)
2008 Python 3.0 发布
2013 加入 Dropbox
2018 辞去 BDFL(因 PEP 572 争议)
2019 从 Dropbox 退休
2020 加入 Microsoft(Faster CPython 项目)
2024 继续在 Microsoft 推动 Python 性能改进Guido 的设计哲学
python
# Guido 多次表达过的设计原则:
# 1. "Python is not about being clever, it's about being clear"
# Python 不追求聪明,追求清晰
# ❌ 聪明
result = (lambda f: (lambda x: x(x))(lambda y: f(lambda *a: y(y)(*a))))(
lambda fib: lambda n: n if n < 2 else fib(n-1) + fib(n-2)
)(10)
# ✅ 清晰
def fibonacci(n):
if n < 2:
return n
return fibonacci(n - 1) + fibonacci(n - 2)
result = fibonacci(10)
# 2. "There's only one way to do things — and that's why it works"
# 只有一种明显的做法——这就是它成功的原因
# 3. "I don't want Python to be the fastest language,
# I want it to be the most productive"
# 我不要最快的语言,我要最有生产力的语言🧠 CS Master's Bridge:BDFL 的领导力
BDFL = Benevolent Dictator For Life(终身仁慈独裁者)
这个称号半开玩笑半认真。Guido 作为 BDFL 的角色:
- 最终裁决者:PEP 争论不下时,Guido 一锤定音
- 品味守门人:拒绝不符合 Python 哲学的提案
- 社区象征:他的存在本身就是一种文化锚点
BDFL 模式在项目早期非常有效——决策快、方向明确、不会分裂。 但随着社区增长,一个人的精力和判断力终将成为瓶颈。
BDFL 模式与治理变革
PEP 572 事件
🎭 The Drama:一个运算符引发的"宪法危机"
2018 年,Guido 提出了 PEP 572——海象运算符
:=。 社区对此产生了激烈争论。支持者认为它消除了重复计算, 反对者认为它降低了可读性。争论本身很正常。不正常的是 争论的方式: 一些社区成员对 Guido 进行了人身攻击和骚扰。
2018 年 7 月 12 日,Guido 发了一封邮件: "I'm tired. I need a break. I'm removing myself as BDFL."
Python 之父辞职了。
从 BDFL 到 Steering Council
Python 治理演变:
1991-2018: BDFL 模式
Guido 有最终裁决权
↓
2018: Guido 辞去 BDFL
↓
社区讨论了多种治理方案:
├── PEP 8010: BDFL 继任者(一个人)
├── PEP 8011: 三人委员会
├── PEP 8012: 社区治理(无领导者)
└── PEP 8016: Steering Council(五人委员会)← 被采纳
↓
2019-至今: Steering Council 模式
5 名成员,每年由核心开发者选举
负责 PEP 审批和项目方向
Steering Council 的权力:
├── 接受或拒绝 PEP
├── 设定项目方向
├── 处理社区治理问题
├── 但不负责日常开发
└── 决策透明,记录公开历届 Steering Council 成员包括:
├── Barry Warsaw(Python 核心开发者 30+ 年)
├── Brett Cannon(Python 核心开发者,微软)
├── Carol Willing(Jupyter 核心开发者)
├── Guido van Rossum(是的,他以成员身份回归)
├── Pablo Galindo Salgado(Python 发布经理)
├── Thomas Wouters(Google)
├── Gregory P. Smith(Google)
└── Emily Morehouse(核心开发者)🌌 The Big Picture:开源项目的治理模式
模式 代表项目 优点 缺点 BDFL Python (早期), Linux 决策快,方向清晰 单点依赖,可扩展性差 委员会 Python (现在), Rust 多元视角,减少偏见 决策可能慢 基金会 Apache, Linux (基金会) 法律保护,中立 可能官僚化 企业主导 Go, TypeScript 资源充足 公司利益可能冲突 社区自治 Arch Linux 最民主 可能混乱 没有完美的治理模式。Python 从 BDFL 过渡到 Steering Council, 是一个健康社区的自然演化——当个人领导力不再够用时, 制度化的治理成为必要。
PyCon、PyPI 和 PSF
PyCon
PyCon = Python Conference
PyCon US(最大的 Python 会议):
├── 每年举办,2500-4000 人参加
├── 3 天主会议 + 2 天 Sprints(集中编码)
├── 演讲、教程、海报、开放空间
├── 招聘市场(Python 工程师抢手!)
└── 社区最重要的面对面交流机会
全球 PyCon:
├── PyCon US (美国)
├── PyCon EU (欧洲,轮换城市)
├── PyCon APAC (亚太)
├── PyCon JP (日本)
├── PyCon China (中国)
├── PyCon India
├── PyCon Africa
└── 30+ 个国家/地区的 PyCon
不能去现场?
├── 大部分演讲有录像(YouTube: PyCon US 频道)
├── 在线参与 Sprints
└── 本地 Python Meetup / User GroupPyPI
PyPI = Python Package Index (pypi.org)
"The Cheese Shop"(致敬 Monty Python 的奶酪店小品)
数据(截至 2024):
├── 500,000+ 个包
├── 5,000,000+ 个版本
├── 800,000+ 个用户
└── 每月数十亿次下载
安装包:
$ pip install requests # 从 PyPI 安装
$ pip install -r requirements.txt
发布包:
$ pip install build twine
$ python -m build # 构建
$ twine upload dist/* # 上传到 PyPI
重要的基础设施:
├── pip: 包安装工具
├── setuptools: 构建工具(传统)
├── build: 构建工具(现代)
├── wheel: 二进制分发格式
├── twine: 上传工具
└── uv: Astral 的超快包管理器(Rust 写的)PSF
PSF = Python Software Foundation
非营利组织,负责:
├── 持有 Python 的知识产权
├── 资助 Python 开发
├── 组织 PyCon US
├── 资助全球 Python 活动
├── 管理 PSF 会员制度
├── 处理法律和商标事务
└── 推动多元化和包容性
资金来源:
├── PyCon 门票和赞助
├── 企业赞助(Google, Microsoft, Meta, Bloomberg...)
├── 个人捐赠
└── PSF 会员费
你可以参与:
├── 成为 PSF 投票会员(免费申请)
├── 参加 Working Groups
├── 申请 PSF 资助(举办活动、开发项目)
└── 向 PSF 捐赠开源贡献入门
🧰 Toolbox:如何开始贡献
很多人想给 Python 生态做贡献,但不知道从何开始。 这里是一条渐进的路径。
第一步:从文档开始
最容易的贡献方式——修复文档:
1. 发现一个错别字或过时的描述
2. 在 GitHub 上 fork CPython 仓库
3. 修改文档(在 Doc/ 目录下)
4. 提交 PR
不需要写 C 代码!
不需要深入理解解释器!
但你的名字会出现在 CPython 的贡献者列表中。
文档贡献的价值被严重低估——
好的文档帮助千万人节省时间。第二步:给第三方库贡献
选择一个你日常使用的库:
1. 查看 Issues 列表
├── 标签 "good first issue" —— 新手友好
├── 标签 "help wanted" —— 需要帮助
└── 标签 "documentation" —— 文档改进
2. 开始之前
├── 读 CONTRIBUTING.md
├── 了解开发流程(fork → branch → PR)
├── 跑通测试(能本地跑测试才能贡献代码)
└── 在 Issue 中表示你想做(避免重复劳动)
3. 提交 PR
├── 写清楚做了什么、为什么
├── 附上测试
├── 遵循项目的代码风格
└── 耐心等待 review(维护者可能很忙)第三步:给 CPython 贡献
CPython 贡献流程:
1. 环境准备
$ git clone https://github.com/python/cpython.git
$ cd cpython
$ ./configure --with-pydebug # 调试构建
$ make -j4 # 编译
$ ./python # 运行你编译的 Python
2. 找到一个 Issue
→ https://github.com/python/cpython/issues
→ 标签 "easy" 或 "newcomer friendly"
3. 开发
$ git checkout -b my-fix
# 修改代码
# 写测试
$ ./python -m test test_xxx # 运行测试
4. 提交 PR
→ 提交到 GitHub
→ CLA(Contributor License Agreement)签名
→ 等待核心开发者 review
5. 核心开发者
→ 持续贡献 → 被邀请成为核心开发者
→ 核心开发者 = 有 commit 权限
→ 截至 2024 年约有 ~100 名核心开发者贡献不一定是代码
非代码贡献同样重要:
├── 回答 Stack Overflow 上的 Python 问题
├── 在 Python Discourse 上参与讨论
├── 写博客分享 Python 知识
├── 在本地 Meetup 做演讲
├── 翻译文档
├── 设计 Logo 和网站
├── 帮助分类 Bug 报告(Triage)
├── 测试 Beta 版本
├── 举办 Python 教学活动
└── 在社交媒体上推广 Python 项目Python 编码风格的演变
PEP 8 的精神
PEP 8: Style Guide for Python Code
不只是一份风格指南——它是 Python 文化的宣言。
最重要的一句话(经常被忽略):
"A Foolish Consistency is the Hobgoblin of Little Minds"
"愚蠢的一致性是小心灵的魔鬼"
PEP 8 不是要你死板地遵守每一条规则——
而是要你理解规则背后的原因,
然后在具体场景中做出合理的判断。PEP 8 核心规则
python
# 1. 缩进:4 个空格(不是 Tab!)
def function():
if True:
do_something()
# 2. 行宽:79 字符(争议最大的规则)
# 现实中很多项目用 88(Black 默认)或 120
# 3. 导入顺序
import os # 标准库
import sys
import requests # 第三方库
import flask
from myproject import utils # 本地模块
# 4. 命名约定
module_name # 模块:小写+下划线
ClassName # 类:大驼峰
function_name # 函数:小写+下划线
CONSTANT_NAME # 常量:全大写+下划线
_private_name # 私有:前缀下划线
__mangled_name # 名字修饰:双下划线前缀
__dunder__ # 魔术方法:双下划线包围
# 5. 空格
spam(ham[1], {eggs: 2}) # ✅
spam( ham[ 1 ], { eggs: 2 } ) # ❌
x = 1 # ✅
x=1 # ❌
def func(x, y=0): # ✅
def func(x, y = 0): # ❌ (默认参数 = 两边不加空格)自动化工具的演化
Python 代码格式化工具的历史:
2001 PEP 8 发布 —— 手动遵守
2006 pycodestyle (原 pep8) —— 检查但不修复
2010 autopep8 —— 自动修复 PEP 8 违规
2013 yapf (Google) —— 完全重新格式化
2018 Black —— "The Uncompromising Code Formatter"
→ 几乎没有配置选项
→ 哲学:"你不需要选择风格,Black 帮你选"
→ 成为 Python 社区的事实标准
2021 Ruff (Astral) —— Rust 写的超快 linter
→ 比 flake8 快 10-100 倍
→ 包含 formatter(兼容 Black)
→ 逐渐取代 flake8 + isort + 多个工具python
# Black 的哲学:消除风格讨论
# Black 之前:代码审查的 30% 时间花在风格讨论上
# "这里应该换行吗?"
# "逗号后面要不要空格?"
# "长函数调用怎么折行?"
# Black 之后:一个命令,统一所有风格
# $ black .
# 没有讨论空间。
# 省下的时间用来讨论真正重要的东西——逻辑和架构。"Pythonic" 的真正含义
🧘 Zen of Code:什么才是 Pythonic?
"Pythonic" 可能是 Python 社区用得最多的词。 但它不只是"用 Python 的方式写代码"—— 它是一种思维方式。
Pythonic 的定义
Pythonic ≠ 用了 Python 的语法特性
Pythonic = 用 Python 社区认可的方式表达意图
核心要素:
1. 利用语言特性表达意图(而非硬套其他语言的范式)
2. 代码读起来像伪代码
3. 遵循最小惊讶原则
4. 简洁但不晦涩Pythonic vs 非 Pythonic 对比
python
# === 遍历 ===
# ❌ C 风格
for i in range(len(items)):
print(items[i])
# ✅ Pythonic
for item in items:
print(item)
# ✅ 需要索引时
for i, item in enumerate(items):
print(f"{i}: {item}")
# === 条件赋值 ===
# ❌ 冗长
if condition:
x = "yes"
else:
x = "no"
# ✅ Pythonic(三元表达式,但不要嵌套)
x = "yes" if condition else "no"
# === 交换变量 ===
# ❌ C 风格
temp = a
a = b
b = temp
# ✅ Pythonic(元组拆包)
a, b = b, a
# === 字典操作 ===
# ❌ 检查再获取
if key in dictionary:
value = dictionary[key]
else:
value = default
# ✅ Pythonic
value = dictionary.get(key, default)
# === 文件操作 ===
# ❌ 手动管理
f = open("file.txt")
try:
content = f.read()
finally:
f.close()
# ✅ Pythonic
with open("file.txt") as f:
content = f.read()
# === 列表操作 ===
# ❌ 命令式
result = []
for item in items:
if item.is_valid():
result.append(item.value)
# ✅ Pythonic(列表推导)
result = [item.value for item in items if item.is_valid()]
# === 真值检测 ===
# ❌ 冗长
if len(my_list) > 0:
...
if x == True:
...
if x is not None:
...
# ✅ Pythonic(利用 truthiness)
if my_list: # 非空列表为 True
...
if x: # 直接检测真值
...
if x is not None: # 这个本来就是 Pythonic 的(显式检查 None)
...
# === EAFP vs LBYL ===
# LBYL: Look Before You Leap(三思而后行)—— C/Java 风格
if os.path.exists(path):
with open(path) as f:
content = f.read()
else:
content = default
# EAFP: Easier to Ask Forgiveness than Permission(先斩后奏)—— Pythonic
try:
with open(path) as f:
content = f.read()
except FileNotFoundError:
content = default
# EAFP 在 Python 中更快(异常是例外情况时)当 Pythonic 走过头
python
# Pythonic 不等于 "一行搞定"
# ❌ 过度 Pythonic(一行流)
data = {k: v for d in [defaults, overrides] for k, v in d.items()
if v is not None and k not in excluded}
# ✅ 合理的 Pythonic
data = {}
for source in [defaults, overrides]:
for key, value in source.items():
if value is not None and key not in excluded:
data[key] = value
# 或者用更清晰的函数抽象
data = merge_dicts(defaults, overrides, exclude=excluded, skip_none=True)🎭 The Drama:Pythonic 不是教条
有人把 "Pythonic" 当作宗教信条: "你没用列表推导?不 Pythonic!" "你写了
for i in range(len(x))?异端!"这恰恰违背了 Pythonic 的精神。 Pythonic 的核心是 可读性(Zen 第 7 条)和 实用性(Zen 第 9 条)。
如果一个列表推导需要三行才能写完,那它不如 for 循环清晰。 如果 LBYL 在你的场景中更直观,那就用 LBYL。
Pythonic 是一种追求,不是一种审判。
总结:社区即语言
🌌 The Big Picture:技术与人
Python 的成功不仅仅是语言设计的成功—— 它是社区文化的成功。
Python 社区的独特文化基因:
价值 体现 包容性 PyCon 的多元化奖学金、行为准则 实用主义 Zen of Python 第 9 条 教育热情 Python 是最常见的教学语言 幽默感 Monty Python、Cheese Shop、BDFL 透明度 PEP 流程、公开讨论、决策记录 渐进主义 类型提示、GIL 移除都是渐进的 一门语言的灵魂不在于它的编译器—— 而在于使用它的人如何对待彼此, 以及他们共同追求的价值。
Python 选择了:让每个人都能写出优雅的代码。 不论你是初学者还是 30 年老手, Python 社区都欢迎你。
参考资源
- Python Developer's Guide
- PEP 8 — Style Guide for Python Code
- PEP 13 — Python Language Governance
- Python Software Foundation
- PyCon US Videos
- Black: The Uncompromising Code Formatter
- The History of Python (Guido's Blog)