码农高天
AI-assisted summary of 【python】和python开发人员用同一套命名系统,一期视频就学会! — original source. Check the original for full context.
Source published:
Key ideas
- PEP 8 命名规范的核心价值在于建立一致性,让标识符本身携带结构层面的元信息,从而降低代码阅读和协作时的认知开销。 (0:00)
- Python 官方推荐格式收敛为三种:常量使用全大写下划线、类使用大驼峰、其余所有对象(包括模块、函数与变量)统一使用全小写下划线,彻底排除了小驼峰。 (0:00)
- 类内部的双下划线强私有并非真正的安全隔离,而是通过 Name Mangling 将变量重命名为 `_类名__变量名`,主要作用是防止子类命名覆盖。 (5:00)
- 开发者须警惕命名遮蔽风险,严禁将变量命名为 list 或 dict 等内置类型,并避免脚本文件名与标准库模块同名导致循环导入混乱。 (10:00)
Detailed notes
## Background 该视频由 YouTube 频道“码农高天”于 2024 年 3 月 30 日发布。视频旨在解决开发者在编写代码时变量命名风格不统一、平白增加思维负担的问题,系统性地介绍了 Python 官方推荐的命名规范,帮助开发者建立统一一致的命名习惯。
## TL;DR 视频深入阐述了遵循 PEP 8 命名规范的核心理念——通过“一致性”降低阅读与维护时的思维开销。高天系统归纳了 Python 中收敛出的三大核心格式:全大写下划线用于常量、大驼峰用于类定义、全小写下划线统领包括模块、函数和变量在内的其余对象。此外,视频细致解析了单下划线占位符、弱私有前缀以及类内部双下划线触发的 Name Mangling(名称修饰)机制,并警告普通开发者切勿滥用 Dunder 魔术方法,最后提醒大家务必警惕覆盖内置函数及与标准库模块重名的常见陷阱。
## Atmosphere & style 整期视频呈现出资深工程师特有的清晰、严谨与务实风格。高天的讲解直截了当且循循善诱,既能提纲挈领地指出命名背后的系统化逻辑,又擅长用底层机制拆解“防君子不防小人”的技术细节;穿插的教学轶事更增添了亲切感,让原本枯燥的编码规范讲解变得生动透彻、极具启发性。
## Bulletin - [00:00](https://www.youtube.com/watch?v=x6I8x-40w6k&t=0s) PEP 8 命名规范的核心价值在于建立一致性,让标识符本身携带结构层面的元信息,从而降低代码阅读和协作时的认知开销。 - [00:00](https://www.youtube.com/watch?v=x6I8x-40w6k&t=0s) Python 官方推荐格式收敛为三种:常量使用全大写下划线、类使用大驼峰、其余所有对象(包括模块、函数与变量)统一使用全小写下划线,彻底排除了小驼峰。 - [05:00](https://www.youtube.com/watch?v=x6I8x-40w6k&t=300s) 类内部的双下划线强私有并非真正的安全隔离,而是通过 Name Mangling 将变量重命名为 `_类名__变量名`,主要作用是防止子类命名覆盖。 - [10:00](https://www.youtube.com/watch?v=x6I8x-40w6k&t=600s) 开发者须警惕命名遮蔽风险,严禁将变量命名为 list 或 dict 等内置类型,并避免脚本文件名与标准库模块同名导致循环导入混乱。
## Key takeaways - [00:00](https://www.youtube.com/watch?v=x6I8x-40w6k&t=0s) 变量名的好坏取决于内容传递的有效信息量与形式规范,需在表达清晰与长度简练之间取得平衡。 - [00:00](https://www.youtube.com/watch?v=x6I8x-40w6k&t=0s) 虽然 Python 3 支持广义 Unicode 字符作为变量名,但出于编码兼容性考虑极不推荐使用中文命名。 - [00:00](https://www.youtube.com/watch?v=x6I8x-40w6k&t=0s) 遵循命名规范的驱动力是一致性(Consistency),规范命名能让读者一眼区分变量、常量、函数与类。 - [00:00](https://www.youtube.com/watch?v=x6I8x-40w6k&t=0s) 全大写加下划线(SCREAMING_SNAKE_CASE)专门用于声明常量,属于开发者之间“互不修改”的语义约定。 - [00:00](https://www.youtube.com/watch?v=x6I8x-40w6k&t=0s) 大驼峰命名法(CamelCase / PascalCase)在 PEP 8 中被严格限制仅用于类定义。 - [00:00](https://www.youtube.com/watch?v=x6I8x-40w6k&t=0s) 模块、函数、普通变量及方法统一采用全小写加下划线(snake_case),因函数与模块在 Python 中属于可传递的一等公民。 - [05:00](https://www.youtube.com/watch?v=x6I8x-40w6k&t=300s) 单独的单下划线 `_` 约定作为占位符使用,明确向代码阅读者传达该变量后续不会被读取的信息。 - [05:00](https://www.youtube.com/watch?v=x6I8x-40w6k&t=300s) 前置单下划线代表弱私有,不仅具备接口提示作用,还能在 `from module import *` 时自动屏蔽导出。 - [05:00](https://www.youtube.com/watch?v=x6I8x-40w6k&t=300s) 类内的双前置下划线触发解释器的名称修饰(Name Mangling)机制,拼接类名前缀以防止属性被意外覆盖。 - [05:00](https://www.youtube.com/watch?v=x6I8x-40w6k&t=300s) 前后双下划线(Dunder)专供 Python 内部魔术方法使用,开发者在自定义普通属性和方法时应严格避免使用。 - [10:00](https://www.youtube.com/watch?v=x6I8x-40w6k&t=600s) 严禁使用 `list`、`dict` 等内置类型构造器作为变量名,以防覆盖全局内置函数并引发隐蔽的运行时 Bug。 - [10:00](https://www.youtube.com/watch?v=x6I8x-40w6k&t=600s) 本地脚本文件命名切忌与标准库模块同名(例如命名为 turtle.py),否则导入检索会优先命中本地文件导致导入失败。
## Detailed walkthrough ### [00:00](https://www.youtube.com/watch?v=x6I8x-40w6k&t=0s) 什么是好的变量名与 PEP 8 命名规范的核心理念
给变量起名字看似是极其基础的内容,但现实中有很多人在命名上仍然无法做到前后一致,平白无故给自己增加了许多思维障碍。在 Python 中,一个合法的变量名必须由字母、下划线和数字组成,且首字符不能是数字。虽然在 Python 3 中字母的定义被扩展成了广义的 Unicode 字符,开发者甚至可以使用中文汉字作为变量名,但通常极不推荐使用中文变量名,因为这常常会因编码问题踩进一些莫名其妙的深坑。合法的规则给予了开发者极大的自由空间,但也带来了新问题:究竟什么才算是一个“好”的变量名?判断好坏通常有两个维度:内容和形式。从内容的角度来看,一句话概括就是这个变量名究竟传递了多少有效信息。例如在 `n`、`name` 和 `username` 三者中,`username` 传递出的有效信息明显最多。不过在实际编写代码时,开发者也必须在信息量与变量名长度之间做出取舍,不能为了塞入更多信息而无休止地拉长名字,这种平衡很大程度上取决于项目本身和工程经验。
从形式上来看,当一个变量名包含多个单词时,如果挤在一起就会难以辨识,而变量名中又严禁包含空格,因此业界演化出了四种典型的书写方式:全小写加下划线(snake_case)、全大写加下划线(SCREAMING_SNAKE_CASE)、大驼峰命名(CamelCase / PascalCase)以及首字母小写的小驼峰命名(mixedCase)。在复杂的底层工程(例如 CPython 源代码)中,甚至会存在 CamelCase 和下划线混用的情况。而官方对于这些形式的推荐用法,详尽地记录在 PEP 8 规范之中。高天指出,遵循这一套命名约定的底层核心驱动力在于“一致性”:“那命名 convention 背后的核心叫做 consistency 也就是一致性,当你拥有一致性的时候,你就会减少一些无谓的思维开销。”这种一致性让变量名本身携带了结构层面的元信息,使阅读者扫一眼名字就能立即判断它是一个普通变量、常量、函数还是类,从而在根本上提升编程效率。
在 Python 的官方开发规范中,常用的命名格式其实只收敛到了三种,完全排除了小驼峰(mixedCase): - **全大写加下划线(SCREAMING_SNAKE_CASE)**:专门用来表示常量。虽然 Python 语言层面并没有真正的不可变常量机制,但大写命名传达的约定是“这个值你别动,我也不会动”;在标准库中看到全大写下划线也可以明确得知其常量身份。 - **大驼峰命名(CamelCase)**:仅在一种场景下使用,那就是类定义(Class definition)。只要看到 CamelCase,就可以立即确信它代表一个类。 - **全小写加下划线(snake_case)**:除去常量和类名之外,其余的所有对象均统一采用小写加下划线命名。
```mermaid flowchart TD accTitle: Python PEP 8 核心命名规则分类 accDescr: 描述 Python 中常量、类与其他所有对象在 PEP 8 中的命名规则分流
Root["Python 标识符命名约定"] --> ConstBranch["常量定义"] Root --> ClassBranch["类定义"] Root --> CommonBranch["其他所有命名"]
ConstBranch --> ConstStyle["全大写加下划线<br/>(SCREAMING_SNAKE_CASE)"] ClassBranch --> ClassStyle["大驼峰命名<br/>(CamelCase)"] CommonBranch --> CommonStyle["全小写加下划线<br/>(snake_case)"]
CommonStyle --> Scope["涵盖范围: module, variable, function, method"] ```
- 包含模块(module)、变量(variable)、函数(function)以及方法(method)在内的所有对象均使用全小写加下划线命名。 - 之所以将模块、函数、普通变量统一归为小写下划线,是因为在 Python 的“一等公民”模型下,函数和模块经常作为变量被传递和引用,具有高度一致的性质。 - 学习统一的命名规范并非单纯为了代码美观,其实质是利用语法约定的自解释性来降低阅读和协作时的认知负荷。
[05:00](https://www.youtube.com/watch?v=x6I8x-40w6k&t=300s) 下划线前缀的语义与功能:从弱私有到 Name Mangling
在 Python 命名规范中,下划线——特别是前置下划线(prefix)——扮演着特殊角色,不仅具备语义暗示,还会在特定场景下直接影响解释器的运行行为。首先是单独的一个下划线 `_`,它在 Python 中是一个完全合法的变量名,通常被约定用作“占位符”。当语法结构强制要求定义一个变量但逻辑上完全不需要用到它时(例如在 `for _ in range(10):` 循环中单纯为了打印 10 个随机数),使用单下划线比使用常规的 `for i in range(10):` 能传达更多的确定性信息,直接告诉阅读者“这个循环变量后续不会被使用”。
```mermaid flowchart LR accTitle: Python 下划线前缀与命名修饰行为 accDescr: 展示双下划线在类内部触发 Name Mangling 的机制
subgraph UserView["开发者代码调用"] CallSecret["obj.__secret<br/>(直接访问失败 AttributeError)"] CallMangled["obj._MyClass__secret<br/>(访问成功)"] end
subgraph InternalMangling["Python 解释器内部机制"] OrigVar["定义: __secret"] --> Mangler["Name Mangling 处理"] Mangler --> MangledVar["重命名为: _MyClass__secret"] end
CallMangled -.->|"能够匹配底层真实字段"| MangledVar ```
进一步扩展则是带有前置单下划线的变量名(如 `_variable`),在 Python 中被称为“弱私有”。它在语义上友好地向调用者示意该属性或方法是私有接口(private),提示外部“不要随便动它”。除了语义提示外,单下划线前缀还会影响实际的运行行为:当其他模块使用 `from module import *` 时,解释器会自动忽略所有以单下划线开头的全局变量,尊重其私有设定。然而之所以称其为“弱私有”,是因为这种限制完全依靠自觉,外部若通过显式路径强行调用(如直接调用 `_get_raw()`),程序依然能够毫无阻碍地执行。与弱私有相对的是在类定义内部使用的“强私有”——双前置下划线(如 `__get_raw` 或 `__secret`)。一旦在类中使用了双下划线开头,外部直接通过属性名访问就会抛出异常报错。然而这种保护在底层其实是“防君子不防小人”,因为 Python 解释器在编译类定义时对其执行了名称修饰(Name Mangling)机制:
> “Python 实际上是在 class definition 里面对双下划线开头的变量进行了一个 name mangling,也就是他在里面偷偷的把这个双下划线开头变量给改名了。”
在名称修饰机制下,解释器只是悄悄在变量名前面拼接了一个下划线和当前类名,原本的 `__secret` 在类 `MyClass` 中实际上被改名为 `_MyClass__secret`。只要通过带有修饰后的名称(如 `obj._MyClass__secret`)依然可以绕过限制成功读取数据,因此这一机制主要用于防止子类命名冲突或无意覆盖,切不可将其视作严格的软件安全特权机制。最后,前后均带有双下划线的命名方式(学名为 Dunder,即 Double Underscore)专门用于保留给 Python 内部的“魔术方法”(Magic Methods,如 `__init__`、`__str__` 等)。高天对此给出了极其严厉的建议:对于 Python 普通开发者而言,原则上只有三个字——“不要用”,开发者绝不应该在自己自定义的普通方法或属性上使用这种双下划线包围的格式。
[10:00](https://www.youtube.com/watch?v=x6I8x-40w6k&t=600s) 避免命名遮蔽与模块导入冲突
在处理命名时,还有一个极其容易被新手甚至有经验的开发者疏忽的陷阱:命名覆盖内置函数(Built-in Functions)。在日常编码中,经常有人顺手将一个列表变量命名为 `list`,或者把一个字典变量命名为 `dict`。这种行为直接覆盖了内置的类型构造器和全局命名空间内的核心函数,极易在后续调用真实内置能力时引发莫名其妙且隐蔽的运行期 Bug。
除了避免变量名与内置函数重名之外,在给 Python 脚本文件本身命名时,也务必严格规避与内置模块或标准库重名。高天分享了一段早年的教学经历:在教初学者使用 Python 自带的 `turtle` 绘图模块时,学生最常踩的一个坑就是把自己的练习文件随手保存为 `turtle.py`。随后脚本第一行执行 `import turtle` 时,Python 的导入机制会优先检索当前目录下的本地文件,导致脚本陷入“自己导入自己”或者无法找到标准库绘图属性的怪圈,整个模块环境瞬间陷入混乱。因此,开发者在任何时候给变量、函数乃至代码文件起名时,脑海中必须始终时刻紧绷一根弦,主动防范和排查潜在的名字冲突。
## Notable quotes > [00:00](https://www.youtube.com/watch?v=x6I8x-40w6k&t=0s) 命名 convention 背后的核心叫做 consistency 也就是一致性,当你拥有一致性的时候,你就会减少一些无谓的思维开销。 — 高天
## Mentioned Python, Python 3, CPython, PEP 8, Unicode, 高天, turtle
## Video description 最近才发现其实很多人在给自己的变量起名字的时候依然无法做到一致,无谓地增加了一些思维障碍。这期视频我们通过介绍官方推荐的命名方式,来带给大家一个统一一致的命名系统,减轻编程负担。
[Source](https://www.youtube.com/watch?v=x6I8x-40w6k)