Python中标识符(如变量名)的有效和无效名称及命名规则

商业

在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。