Python 软件基金会 PSF
Python 软件基金会(Python Software Foundation,简称 PSF)是 Python 语言与社区的非营利法人主体。它持有 Python 的商标与知识产权、组织 PyCon US、发放社区资助、运行行为准则的执法机制。理解 PSF 的职责与参与方式,能帮你把「使用者」的身份扩展为「社区参与者」,也能让你在需要资源支持时有明确的申请入口。
前置知识
阅读本节前,建议先了解:如何提问与寻求帮助
基础概念
使命与定位
PSF 的官方使命(Mission Statement)是:
推广、保护并推进 Python 编程语言,支持并促进多元化、国际化的 Python 程序员社区的成长。
拆开看,这句话包含四件事:
| 关键词 | 含义 | 对应动作 |
|---|---|---|
| 推广(promote) | 让更多人用上 Python | 教育项目、会议、宣传 |
| 保护(protect) | 守住语言与生态的合法权益 | 持有商标、处理侵权 |
| 推进(advance) | 让语言本身向前发展 | 通过社区机制间接支持开发 |
| 支持社区(support) | 让社区可持续 | 资助、行为准则、工作小组 |
PSF 与 CPython 的关系
一个常见误解是「PSF 决定 Python 怎么发展」。实际情况更微妙:
| 问题 | 决定方 |
|---|---|
| 语言特性要不要加 | 指导委员会(Steering Council),见 PEP 13 |
| 打包标准怎么定 | 打包治理机构(见下文) |
| Python 商标归谁 | PSF |
| PyCon US 谁办 | PSF |
| 资助发给谁 | PSF 的资助工作小组 |
| 服务器等基础设施 | PSF 基础设施工作小组 + 社区贡献者 |
PSF 是法人主体与资金/法律/社区支持的承担者,而不是技术决策者。技术决策通过 PEP 流程与选举产生的指导委员会完成。
会员类别
PSF 自 2014 年起改为开放会员制:任何人都可以加入。会员分为四类:
| 类别 | 英文 | 费用 | 是否可投票 | 条件 |
|---|---|---|---|---|
| 基础会员 | Basic Member | 免费 | 否 | 声明支持 Python 并同意社区行为准则 |
| 支持会员 | Supporting Member | 年度捐款 | 是 | 每年向 PSF 捐款 |
| 贡献会员 | Contributing Member | 免费 | 是 | 每月至少 5 小时志愿服务(开源软件、办活动、跑基础设施、参与工作小组等) |
| 会士 | Fellow | 免费 | 是 | 由社区提名、会员投票选出,表彰对 Python 的杰出贡献 |
投票资格需要注意两个条件:先具备资格(支持/贡献/会士),再每年确认一次要行使投票权(affirm voting status)。基础会员的信息与投票层级分属两个站点管理:python.org 管理基础会员,psfmember.org 管理投票层级。
"""判断一条会员记录是否具备当年投票资格。"""
from dataclasses import dataclass
@dataclass(frozen=True)
class Member:
"""PSF 会员记录。"""
name: str
category: str
affirmed_this_year: bool
VOTING_CATEGORIES = frozenset({"supporting", "contributing", "fellow"})
def can_vote(member: Member) -> bool:
"""只有投票层级且当年已确认的会员才有投票权。"""
return member.category in VOTING_CATEGORIES and member.affirmed_this_year
if __name__ == "__main__":
members = [
Member("基础会员", "basic", True),
Member("支持会员(未确认)", "supporting", False),
Member("贡献会员", "contributing", True),
]
for member in members:
print(f"{member.name:<18} 投票权:{can_vote(member)}")语法与用法
参与渠道一览
| 渠道 | 地址 | 用途 |
|---|---|---|
| PSF 官网 | https://www.python.org/psf/ | 使命、董事会、新闻 |
| 会员注册 | https://www.python.org/users/membership/ | 注册基础会员 |
| 投票会员管理 | https://psfmember.org/ | 支持/贡献会员与投票确认 |
| 工作小组 | https://www.python.org/psf/workgroups/ | 各小组职责与联系方式 |
| 资助申请 | https://www.python.org/psf/grants/ | 会议、工作坊、Meetup 资助 |
| 行为准则 | https://www.python.org/psf/conduct/ | 社区行为准则全文 |
| 行为准则举报 | https://www.python.org/psf/conduct/reporting/ | 举报入口 |
| 会士提名 | https://www.python.org/psf/fellows/ | 会士制度说明 |
用命令行检查行为准则与资助页面是否可达
维护团队文档时,可以用脚本批量检查这些链接的有效性。
"""批量检查 PSF 相关链接的可达性。"""
import urllib.error
import urllib.request
URLS: tuple[str, ...] = (
"https://www.python.org/psf/",
"https://www.python.org/psf/conduct/",
"https://www.python.org/psf/workgroups/",
"https://www.python.org/psf/grants/",
)
def check(url: str, timeout: float = 15.0) -> str:
"""返回链接的可达状态。"""
request = urllib.request.Request(url, method="HEAD", headers={"User-Agent": "link-checker"})
try:
with urllib.request.urlopen(request, timeout=timeout) as response:
return f"{response.status} {url}"
except urllib.error.HTTPError as exc:
return f"{exc.code} {url}"
except urllib.error.URLError as exc:
return f"不可达({exc.reason}) {url}"
if __name__ == "__main__":
for target in URLS:
print(check(target))详细说明
董事会与工作小组
PSF 由董事会(Board of Directors)治理,董事会成员由投票会员选举产生。董事会之下设有若干工作小组(Work Groups),分别负责具体事务。
活跃的工作小组包括:
| 工作小组 | 成立时间 | 职责 |
|---|---|---|
| 行为准则工作小组(Code of Conduct WG) | 2018-05 | 执行行为准则,为社区提供准则建议 |
| 多元与包容工作小组(Diversity and Inclusion WG) | 2020-11 | 促进社区的多元与国际化 |
| 教育与拓展工作小组(Education & Outreach WG) | 2011-06,2024-12 重组 | 支持 Python 教育的推广与提升 |
| 会士工作小组(Fellows WG) | 2017-07 | 负责会士提名与评选 |
| 资助工作小组(Grants WG) | — | 审核、批准或拒绝资助申请 |
| 基础设施工作小组(Infrastructure WG) | — | 维护 PSF 相关基础设施 |
| Python 职位板工作小组(Job Board WG) | — | 运营 Python 职位板 |
| 打包工作小组(Packaging WG) | — | 打包生态相关事务 |
| 商标工作小组(Trademarks WG) | — | 商标使用与授权 |
行为准则工作小组的目标写得很明确:通过执行 PSF 行为准则来培育多元包容的社区,同时为社区提供行为准则方面的指导与建议——这一切服务于 PSF「持续推进 Python 相关技术与教育资源」的使命。
行为准则(Code of Conduct)
PSF 行为准则(Code of Conduct)覆盖 PSF 支持的所有基础设施,包括 Discourse、issue tracker、GitHub 等,也包括会议与线下活动。核心要求可以概括为:
无论对方在项目中处于什么位置,每个人都应保持开放、体贴与尊重。
这一覆盖面常被误解。它意味着你在 CPython 的 issue 区用攻击性语言,与在 PyCon 现场的行为不当,都属于同一准则的管辖范围。
举报流程由行为准则工作小组处理;涉及会议时,通常同时有会议自身的准则与现场联系人。
资助项目(Grants)
资助工作小组(Grants WG)由董事会授权,负责审查、批准或拒绝资助申请,覆盖 Python 会议、培训工作坊、Meetup、开发项目等。
资助计划遵循一组明确的指导原则:
| 层面 | 原则 |
|---|---|
| 计划整体 | 有影响力、可靠、公平、透明、可持续 |
| 资金分配 | 追求地理公平、优先服务不足的社区、优先高投资回报、兼顾新老社区、在专长领域内评估、确保 Python 与 Pythonista 得到支持 |
资助工作小组还负责社区伙伴计划(Community Partner Program)的申请——它是非金钱性质的合作,PSF 允许申请方以「Community Partner」名义使用 PSF 名称与标志,并转发合规的社交媒体内容。
申请资助时最容易踩的坑:申请的项目必须契合 PSF 的非营利使命。纯商业推广、营利性活动通常不符合条件。
打包治理:从工作小组到打包委员会
打包领域的治理经历了一次重要演进,值得单独说明,因为它体现社区如何自我迭代。
过去,打包事务由 PSF 的打包工作小组(Packaging WG)与 PyPA(Python Packaging Authority)共同承担:PyPA 维护 pip、setuptools 等工具,打包工作小组提供组织支撑。这种「工具维护者 + PSF 小组」的双轨结构在生态成熟后暴露出职责边界不清、跨项目协调困难等问题。
PEP 772(Packaging Council governance process)给出了新的方案:设立一个打包委员会(Packaging Council),对打包标准、工具与实现拥有广泛权力,同时明确它应当尽量少行使权力,而是用权力去建立标准流程——这与指导委员会的理念一致。PEP 772 的状态为 Accepted,类型为 Process,主题归类为 Governance 与 Packaging,且取代(Replaces)PEP 609。
这提示了一个重要模式:当某个领域复杂到需要长期协调时,社区会通过流程型 PEP 建立专门的治理机构。类型标注、发布周期、PEP 基础设施都走过类似路径。
商标与知识产权
PSF 持有 Python 相关商标,并负责授权使用。这解释了几个常见现象:
- 第三方项目命名时需避免误导性使用「Python」暗示官方背书。
- 会议的官方名称与标志使用需遵循 PSF 政策。
- Python 许可证(PSF License)由 PSF 管理,与 GPL 等许可证的兼容性是包装时需要考虑的问题。
# 查看本机 Python 的许可证信息
python -c "import sys; print(sys.copyright)"Copyright (c) 2001-2024 Python Software Foundation.
All Rights Reserved.
Copyright (c) 2000 BeOpen.com.
All Rights Reserved.
...如何真正「参与」而不只是「注册」
注册基础会员只需一步,但真正产生价值的是贡献会员路径:每月 5 小时的志愿服务即可。
可选的贡献方式:
| 方式 | 具体动作 | 门槛 |
|---|---|---|
| 文档 | 修正官方文档错别字、补充示例、参与翻译 | 低 |
| 翻译 | 参与 docs.python.org 中文翻译 | 低到中 |
| 分诊(Triage) | 为 issue 加标签、复现、请求补充信息 | 中 |
| 代码 | 修复「easy」标签的 issue | 中 |
| 基础设施 | 参与 PSF 基础设施工作小组 | 中到高 |
| 组织活动 | 本地 Meetup、PyCon 分会场 | 中 |
| 工作小组 | 加入某个 PSF 工作小组 | 高(需持续投入) |
Python 开发者指南(Developer's Guide)中设有「Core Python Mentorship」——如果你希望在核心开发方向起步,可以申请导师带路,这是官方提供的低成本入口。
与 PSF 相关的常见疑问
问:不捐钱就不是社区成员吗? 不是。基础会员免费,且贡献会员同样免费。捐款只是其中一种参与方式。
问:PSF 能帮我解决技术问题吗? 不能。技术问题走文档、Discourse、issue tracker;PSF 处理的是组织、资金、法律与社区层面事务。
问:PyCon 是 PSF 办的吗? PyCon US 由 PSF 承办与资助。各地 PyCon(如 EuroPython、PyCon China)通常由本地社区组织,PSF 可提供资助或「社区伙伴」支持。
问:为什么我明明是支持会员,python.org 上却显示基础会员? 因为投票层级在 psfmember.org 单独管理,python.org 只展示基础会员身份。核验投票资格要去 psfmember.org。
实战示例
示例一:生成团队「社区参与」说明文档
"""生成 PSF 参与方式的速查表(Markdown)。"""
from dataclasses import dataclass
@dataclass(frozen=True)
class Way:
"""一种参与方式。"""
title: str
effort: str
url: str
WAYS: tuple[Way, ...] = (
Way("注册基础会员", "5 分钟", "https://www.python.org/users/membership/"),
Way("确认投票资格", "每年一次", "https://psfmember.org/"),
Way("申请活动资助", "提前数周", "https://www.python.org/psf/grants/"),
Way("加入工作小组", "持续投入", "https://www.python.org/psf/workgroups/"),
Way("了解行为准则", "10 分钟", "https://www.python.org/psf/conduct/"),
)
def render(ways: tuple[Way, ...]) -> str:
"""渲染为 Markdown 表格。"""
rows = ["| 参与方式 | 投入 | 入口 |", "|---------|------|------|"]
rows.extend(f"| {way.title} | {way.effort} | <{way.url}> |" for way in ways)
return "\n".join(rows)
if __name__ == "__main__":
print(render(WAYS))示例二:资助申请前的自查清单
"""资助申请自查:判断项目是否符合 PSF 资助定位。"""
from dataclasses import dataclass, field
@dataclass
class GrantProposal:
"""一份资助申请的关键属性。"""
title: str
is_nonprofit: bool
benefits_community: bool
has_budget: bool
serves_underserved: bool = False
is_commercial_promo: bool = False
checks: list[str] = field(default_factory=list)
def evaluate(proposal: GrantProposal) -> tuple[bool, list[str]]:
"""返回(是否建议提交,问题清单)。"""
problems: list[str] = []
if not proposal.is_nonprofit:
problems.append("项目须契合 PSF 的非营利使命")
if proposal.is_commercial_promo:
problems.append("纯商业推广通常不符合资助条件")
if not proposal.benefits_community:
problems.append("需说明对 Python 社区的具体收益")
if not proposal.has_budget:
problems.append("缺少预算明细,评审难以评估投资回报")
if proposal.serves_underserved:
proposal.checks.append("已覆盖「优先服务不足社区」原则,可作为加分项")
return not problems, problems
if __name__ == "__main__":
proposal = GrantProposal(
title="本地 Python 教学工作坊",
is_nonprofit=True,
benefits_community=True,
has_budget=True,
serves_underserved=True,
)
ok, issues = evaluate(proposal)
print(f"建议提交:{ok}")
for issue in issues:
print(f" - 待补充:{issue}")
for note in proposal.checks:
print(f" - {note}")示例三:为团队仓库添加行为准则引用
"""生成一段可放入 CONTRIBUTING.md 的行为准则说明。"""
from pathlib import Path
TEMPLATE = """## 行为准则
本项目遵循 [PSF 行为准则](https://www.python.org/psf/conduct/)。
所有参与者(包括 issue、PR、讨论区、线上会议)都应保持开放、体贴与尊重。
如需举报不当行为,请通过 [官方举报渠道](https://www.python.org/psf/conduct/reporting/)
联系 PSF 行为准则工作小组。项目维护者也会在收到私下告知后协助处理。
"""
def write_snippet(target: Path) -> None:
"""把行为准则段落写入指定文件(追加)。"""
existing = target.read_text(encoding="utf-8") if target.exists() else ""
if "PSF 行为准则" in existing:
print(f"{target} 已包含行为准则说明,跳过")
return
target.write_text(existing + "\n" + TEMPLATE, encoding="utf-8")
print(f"已写入 {target}")
if __name__ == "__main__":
write_snippet(Path("CONTRIBUTING.md"))示例四:整理贡献会员的志愿服务记录
贡献会员要求每月至少 5 小时志愿服务,记录工时有助于年度确认。
"""汇总志愿服务时长,判断是否达到贡献会员门槛。"""
from dataclasses import dataclass
from datetime import date
MONTHLY_REQUIREMENT_HOURS = 5.0
@dataclass(frozen=True)
class ServiceLog:
"""一条志愿服务记录。"""
day: date
hours: float
activity: str
def monthly_totals(logs: list[ServiceLog]) -> dict[str, float]:
"""按「年-月」汇总工时。"""
totals: dict[str, float] = {}
for entry in logs:
key = entry.day.strftime("%Y-%m")
totals[key] = totals.get(key, 0.0) + entry.hours
return totals
def report(logs: list[ServiceLog]) -> None:
"""输出每月达标情况。"""
for month, hours in sorted(monthly_totals(logs).items()):
status = "达标" if hours >= MONTHLY_REQUIREMENT_HOURS else "未达标"
print(f"{month}: {hours:>5.1f} 小时 | {status}")
if __name__ == "__main__":
logs = [
ServiceLog(date(2026, 9, 3), 2.0, "文档翻译"),
ServiceLog(date(2026, 9, 17), 3.5, "issue 分诊"),
ServiceLog(date(2026, 10, 2), 1.5, "本地 Meetup 组织"),
]
report(logs)注意事项
- PSF 不是技术决策机构:语言与标准的决策权在指导委员会与相关治理机构,不要把技术问题提到 PSF。
- 投票资格需每年确认:具备投票层级还不够,必须每年 affirm。
- 两套会员系统:基础会员在
python.org,投票层级在psfmember.org,看到「显示为基础会员」属正常现象。 - 行为准则覆盖面广:包括 GitHub、Discourse、issue tracker、会议等所有 PSF 支持的基础设施。
- 资助需契合非营利使命:商业推广类活动通常不符合条件。
- 打包治理已变更:PEP 772(Accepted)设立打包委员会并取代 PEP 609,引用旧结构时注意时效。
- 工作小组成员名单会变动:引用具体人名前先核对官网当前信息。
- 不要把 PSF 当作客服:它没有义务解答个人技术问题。
最佳实践
- 在团队与个人项目中引用 PSF 行为准则,并在
CONTRIBUTING.md中给出举报渠道,这是低成本、高价值的社区规范建设。 - 若你或团队定期做开源志愿工作,登记贡献会员:既获得投票权,也让投入被官方记录。
- 组织本地活动时,提前评估是否符合资助条件,按「地理公平、服务不足社区、投资回报」原则准备材料。
- 关注打包委员会与指导委员会的更替,它们直接决定长期技术路线的方向。相关公告通常在 Discourse 发布。
- 新人参与开源时,优先从文档与分诊(triage)入手,门槛低、反馈快,再逐步过渡到代码与工作小组。
- 引用 PSF 相关链接时定期校验可达性(可用本节的检查脚本),避免文档中出现失效链接。
下一节
恭喜你完成了阶段一「入门指引」的全部内容。接下来进入阶段二,从最基础的变量与命名开始系统学习 Python 语法: 下一节:变量命名规范