在Python中,标识符 (变量、函数、类等的名称) 需要按照规则来定义。不符合规则的名字不能作为标识符使用,会导致错误。
这里提供了以下信息。
- 可用于和不可用于标识符(名称)的字符
- ASCII字符
- Unicode字符
- 正常化
- 检查字符串是否是一个有效的标识符。
isidentifier()
- 不能作为标识符(名称)使用的词(保留词)。
- 不应作为标识符(名称)使用的词语
- PEP8的命名惯例
下面的描述是在Python 3中给出的,在Python 2中可能有所不同。
可用于和不可用于标识符(名称)的字符
表示可以和不能作为标识符(名称)的字符。
此外,虽然有很多东西要写,但基本上你需要记住的是以下内容。
- 使用大写和小写字母、数字和下划线。
- 第一个(第一)字母不能是数字。
ASCII字符
可用作标识符(名称)的ASCII字符是大写和小写字母(A~Z,a~z)、数字(0~9)和下划线(_)。字母表是区分大小写的。
AbcDef_123 = 100
print(AbcDef_123)
# 100
不能使用下划线以外的符号。
# AbcDef-123 = 100
# SyntaxError: can't assign to operator
另外,数字不能用在开头(第一个字母)。
# 1_abc = 100
# SyntaxError: invalid token
下划线也可以用在开头。
_abc = 100
print(_abc)
# 100
然而,请注意,开头的下划线可能有特殊含义。
Unicode字符
从Python 3开始,也可以使用Unicode字符。
変数1 = 100
print(変数1)
# 100
并非所有的Unicode字符都可以使用,根据Unicode类别的不同,有些字符不能使用。例如,标点符号和象形文字等符号就不能使用。
# 変数。 = 100
# SyntaxError: invalid character in identifier
# ☺ = 100
# SyntaxError: invalid character in identifier
关于可以使用的Unicode类别代码,见官方文件。
在许多情况下,使用汉字等没有任何优势,只是因为Unicode字符也可以使用(没有错误)。
正常化
Unicode字符被转换为规范化的形式NFKC进行解释。例如,全宽字母被转换为半宽字母(ASCII字符)。
请注意,即使源代码显示的是不同的显示方式,它也被认为是同一个对象,并将被覆盖。
ABC = 100
ABC = -100
print(ABC)
# -100
print(ABC)
# -100
print(ABC is ABC)
# True
检查字符串是否是一个有效的标识符:isidentifier()
一个字符串作为标识符是否有效,可以用字符串方法isidentifier()检查。
如果它作为一个标识符是有效的,它将返回true,如果它是无效的,则返回false。
print('AbcDef_123'.isidentifier())
# True
print('AbcDef-123'.isidentifier())
# False
print('変数1'.isidentifier())
# True
print('☺'.isidentifier())
# False
不能作为标识符(名称)使用的词(保留词)。
有一些词(保留词)不能作为标识符使用,即使它们是作为标识符(名称)的有效字符串。
由于保留字是一个有效的字符串作为标识符,isidentifier()返回真,但如果它被用作标识符会发生错误。
print('None'.isidentifier())
# True
# None = 100
# SyntaxError: can't assign to keyword
要获得一个保留字的列表并检查一个字符串是否是保留字,请使用标准库的关键字模块。
不应作为标识符(名称)使用的词语
例如,Python 内置函数的名称可以作为标识符,所以你可以将新的值作为变量分配给它们。
例如,len()是一个内置的函数,它返回一个列表中的元素数或一个字符串中的字符数。
print(len)
# <built-in function len>
print(len('abc'))
# 3
如果你给这个名称len分配一个新的值,原来的函数将被覆盖,变得无法使用。请注意,在分配一个新的值时,不会打印错误或警告。
print(len('abc'))
# 3
len = 100
print(len)
# 100
# print(len('abc'))
# TypeError: 'int' object is not callable
另一个常见的错误是使用 list = [0, 1, 2],这样就无法使用 list() 。要小心。
PEP8的命名惯例
PEP是Python Enhancement Proposal的缩写,是描述Python的新特性和其他方面的文件。
PEP stands for Python Enhancement Proposal. A PEP is a design document providing information to the Python community, or describing a new feature for Python or its processes or environment.
PEP 1 — PEP Purpose and Guidelines | Python.org
PEP8是第八个,它描述了 “Python代码的风格指南”,也就是Python的风格指南。
还提到了命名惯例。
更多细节见上面的链接,但例如,建议采用以下写作方式。
- 模块
lowercase_underscore
- 小写字母+下划线
- 包装
lowercase
- 所有小写字母
- 类,例外情况
CapitalizedWords
(CamelCase
)- 大写一个单词的第一个字母,不要用下划线
- 函数、变量和方法
lowercase_underscore
- 小写字母+下划线
- 常数
ALL_CAPS
- 大写字母+下划线
然而,如果你的组织没有自己的命名惯例,建议遵循PEP8。