Skip to content

第 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:开源项目的治理模式

模式代表项目优点缺点
BDFLPython (早期), 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 Group

PyPI ​

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 社区都欢迎你。


参考资源 ​


👈 第 5 章:Python 语言演进 | 👉 第 7 章:Python vs 世界

⬆️ 返回 Stage 5 目录

由 VitePress 构建,Markdown 教材原地维护。