标识符
# 标识符
在 Python 的世界里,我们为变量、函数、类等几乎所有东西所起的名字,统称为 标识符 (Identifier)。一个好的标识符就像一个清晰的路牌,能引导我们轻松理解代码的意图。本指南将带你从最基础的语法规则到社区公认的最佳实践,全面掌握标识符的命名艺术。
# 1. 什么是标识符?
简单来说,标识符就是程序员给代码实体起的名字。
- 它的作用:作为程序中某个实体的唯一“身份证”,让我们能够方便地引用它。
- 它的应用:变量名、函数名、类名、模块名、常量名等都是标识符。
# 'student_name' 是一个变量标识符
student_name = "张三"
# 'calculate_area' 是一个函数标识符
def calculate_area(radius):
pass
# 'Circle' 是一个类标识符
class Circle:
pass
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 2. 硬性语法规则:不可逾越的红线
以下是 Python 语言强制规定的语法,必须严格遵守,否则程序会立即抛出 SyntaxError
错误。
# 2.1 字符构成
- 合法字符:只能包含 英文字母 (a-z, A-Z)、数字 (0-9) 和 下划线 (
_
)。 - 非法字符:严禁使用空格、连字符 (
-
)、@、#、$ 等任何其他特殊符号。
# ✅ 合法示例
user_name
age18
_internal_data
# ❌ 非法示例
# user-name # 包含连字符
# user age # 包含空格
# user@ # 包含特殊符号
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 2.2 开头字符
- 标识符的 第一个字符不能是数字。
- 必须以 字母 或 下划线 (
_
) 开头。
# ✅ 合法示例
name1
_1st_place # 合法,但不推荐
# ❌ 非法示例
# 1st_place
# 2_users
1
2
3
4
5
6
7
2
3
4
5
6
7
# 2.3 大小写敏感
- Python 是 大小写敏感 的。
name
、Name
和NAME
会被视为三个完全不同的标识符。
age = 20
Age = 30
print(age) # 输出: 20
1
2
3
2
3
为避免混淆,强烈建议在项目中保持统一的大小写风格。
# 2.4 关键字规避
- Python 的 关键字 (Keywords) 是语言保留的特殊词汇,绝对不能用作标识符。
如何查看所有关键字?
import keyword print(keyword.kwlist)
1
2
# ❌ 非法示例: 使用关键字
# class = "我的班级"
# def = "我的函数"
# return = "返回值"
# ✅ 正确的规避方法: 在名称后添加下划线或更换描述
class_name = "我的班级"
return_value = "返回值"
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 3. PEP 8 命名规范:社区的优雅约定
PEP 8 是 Python 官方的代码风格指南。遵循它并非强制,但这是社区的共识,能让你的代码更专业、更易于他人阅读。
标识符类型 | 命名风格 | 示例 |
---|---|---|
变量、函数、方法 | snake_case (蛇形命名法) | student_name , calculate_average() |
类 (Class) | PascalCase (帕斯卡命名法) | StudentInfo , DatabaseManager |
常量 (Constant) | UPPER_SNAKE_CASE (全大写蛇形) | MAX_USERS , DEFAULT_TIMEOUT |
模块 (Module) | all_lowercase (全小写) | math_utils.py , config.py |
# 常量
MAX_CONNECTIONS = 10
API_KEY = "SECRET_KEY"
# 变量
user_name = "Alice"
is_logged_in = True
# 函数
def send_notification(user, message):
# ... 函数体 ...
pass
# 类
class UserProfile:
# ... 类体 ...
pass
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 4. 特殊下划线命名约定
下划线在 Python 命名中扮演着特殊的角色,它们是重要的“约定”,向其他开发者传达特定意图。
模式 | 名称 | 含义与用途 |
---|---|---|
_single_leading | 单前导下划线 | 内部使用约定。表示这是一个“受保护”的变量或方法,不希望被外部直接调用。这只是一种君子协定,Python 本身不阻止访问。 |
__double_leading | 双前导下划线 | 私有成员。当用在类属性中时,会触发 Python 的“名称改写(Name Mangling)”,使其在外部极难被意外访问。 |
__double__ | 双前导和双结尾 | 魔术方法/属性。由 Python 官方定义和使用的特殊名称,用于实现特定功能(如 __init__ , __str__ )。永远不要自己发明这种格式的名称。 |
_ | 单独下划线 | 临时或无关紧要的变量。常用于表示某个值被刻意忽略。 |
class MyClass:
def __init__(self):
self.public = "公开的"
self._protected = "受保护的"
self.__private = "私有的"
def __str__(self): # 魔术方法
return "MyClass Instance"
# 临时变量
for _ in range(5):
print("循环,但不需要索引")
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# 5. 命名最佳实践与常见误区
# 5.1 语义清晰,避免歧义
- 名字应能准确反映其用途,即 “见名知意”。
- 函数名应以 动词 开头,体现其行为,如
get_user()
,calculate_sum()
。 - 布尔变量应以
is_
,has_
,can_
等开头,使其读起来像一个判断题。
# ❌ 糟糕的命名
temp = 25 # temp 是什么?温度?临时变量?
flag = True # flag 代表什么状态?
data = get_data() # get_data 是从哪里获取数据?
# ✅ 优秀的命名
temperature_celsius = 25
is_user_active = True
def fetch_data_from_database():
pass
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 5.2 避免覆盖内置函数
切勿 使用 Python 的内置函数名(如 list
, dict
, str
, id
, sum
等)作为你的标识符。这会覆盖它们的原有功能,导致非常隐蔽且难以调试的错误。
# ❌ 灾难性的错误
list = [1, 2, 3]
# ... 后来 ...
# new_tuple = list((4, 5, 6)) # TypeError: 'list' object is not callable
1
2
3
4
2
3
4
# 5.3 统一风格,保持一致
在一个项目或团队中,应始终坚持同一种命名风格。如果项目中大部分代码使用 user_id
,就不要在新的代码中引入 userID
。
# 6. 标识符命名速查表
类型 | 推荐规范 (PEP 8) | 正确示例 ✅ | 错误或不推荐 ❌ |
---|---|---|---|
普通变量 | snake_case | user_name , age | UserName , user-name , str |
布尔变量 | is_ , has_ 等前缀 | is_active , has_permission | active , permission_flag |
常量 | UPPER_SNAKE_CASE | MAX_SIZE , API_KEY | max_size , MaxSize |
函数/方法 | snake_case | get_user_info() , _internal_func() | GetUserInfo() , user_info() |
类 | PascalCase | Student , DatabaseManager | student , database_manager |
模块 | all_lowercase | utils.py , api_client.py | Utils.py , api-client.py |
魔术方法 | __double__ | __init__ , __str__ | _init_ , my_method |
编辑此页 (opens new window)
上次更新: 2025/07/23, 06:33:16