返回介绍

变量命名规则

发布于 2024-01-29 22:24:16 字数 3979 浏览 0 评论 0 收藏 0

介绍了赋值语句后,可以对变量名的使用做更正式的介绍。在Python中,当为变量名赋值时,变量名就会存在。但是,为程序中的事物选择变量名时,要遵循如下规则。

语法:(下划线或字母)+(任意数目的字母、数字或下划线)

变量名必须以下划线或字母开头,而后面接任意数目的字母、数字或下划线。_spam、spam以及Spam_1都是合法的变量名,但1_Spam、spam$以及@#!则不是。

区分大小写:SPAM和spam并不同

Python程序中区分大小写,包括创建的变量名以及保留字。例如,变量名X和x指的是两个不同的变量。就可移植性而言,大小写在导入的模块文件名中也很重要,即使是在文件系统不分大小写的平台上也是如此。

禁止使用保留字

定义的变量名不能和Python语言中有特殊意义的名称相同。例如,如果使用像class这样的变量名,Python会引发语法错误,但允许使用kclass和Class作为变量名。表11-3列出当前Python中的保留字。

表11-3针对Python 3.0。在Python 2.6中,保留字的范围略有不同:

·print是一个保留字,因为打印是一条语句,而不是一个内置函数(本章稍后更详细地介绍)。

·exec是一个保留字,因为它是一条语句,而不是一个内置函数。

·nonlocal不是一个保留字,因为这条语句不可用。

在更早的Python中,情况或多或少也有些不同,有以下一些变化:

·with和as在Python 2.6之前都不是保留字,只有在上下文管理器正式可用之后,它们才是。

·yield在Python 2.3之前都不是保留字,只有在生成器函数可用后它才是。

·在Python 2.5中,yield从语句变为表达式,但它仍然是一个保留字,而不是一个内置函数。

你将会看到,大多数Python保留字都是小写的。而且它们确实是保留字,不像本书下一部分介绍的内置作用域中的变量名,你无法对保留字做赋值运算(例如,and=1会造成语法错误)[1]

除了大小写是混合的,表11-3中的前三项True、False和None的含义多少有些特殊——它们也出现在第17章所介绍的Python的内置函数作用域中,并且它们也是可以分配给对象的技术名称。在所有其他的含义下,它们确实都是保留字,并且,在脚本中,除了它们所表示的对象之外,不可用于任何其他的用途。所有其他的保留字在Python的语法中都是固定的,只能在其本意的特定环境中使用。

此外,因为import语句中的模块变量名会变成脚本中的变量,这种限制也会扩展到模块的文件名:你可以写and.py和my-code.py这类文件。但是你无法将其导入,因为其变量名没有".py"扩展名时,就会变成代码中的变量。因此必须遵循刚才所提到的所有变量规则。保留字是禁区,破折号不行,不过下划线可以。第五部分我们会再次介绍这个概念。

Python的废弃协议

注意保留字在一种语言的各个阶段是如何变化的,这是一件有趣的事情。当一种新的功能可能会影响到已有的代码的时候,Python通常会使其成为可选的,并且将其发布为“废弃的”,以便在正式使用该功能之前的一个或多个发布中提出警告。这种思路使你有足够的时间注意到警告,并且在迁移到新的发布之前更新自己的代码。对于像Python 3.0这样的重要的新的发布(它广泛地影响到已有的代码),情况并非如此,但在大多数情况下,这是成立的。

例如,在Python 2.2中,yield是一个可选的扩展,但是,它在Python 2.3中是一个标准的关键字。它和生成器函数联合使用。这是Python违反向后兼容的一小部分实例中的一个。然而,yield随着时间逐步变化:在Python 2.2中它开始产生废弃警告,并且直到Python 2.3都还没有使用。

类似地,在Python 2.6中,with和as变成了用于上下文管理器(异常处理的一种新形式)的新的保留字。这两个单词在Python 2.5中不是保留字,除非用一个from__future__import(本书稍后介绍)手动打开环境管理器功能。使用Python 2.5的时候,with和as产生关于将要发生的变化的警告——除非是在Python 2.5中的IDLE版本中,它似乎已经支持此功能(即,在Python 2.5中使用这些单词作为变量名称确实会产生错误,但只是在其IDLE GUI的版本中会产生错误)。

命名惯例

除了这些规则外,还有一组命名惯例——这些并非是必要的规则,但一般在实际中都会遵守。例如,因为变量名前后有下划线时(例如,__name__),通常对Python解释器都有特殊意义,你应该避免让变量名使用这种样式。以下是Python遵循的一些惯例。

·以单一下划线开头的变量名(_X)不会被from module import*语句导入(第22章说明)。

·前后有下划线的变量名(__X__)是系统定义的变量名,对解释器有特殊意义。

·以两下划线开头、但结尾没有两个下划线的变量名(__X)是类的本地(“压缩”)变量(第30章说明)。

·通过交互模式运行时,只有单个下划线的变量名(_)会保存最后表达式的结果。

除了这些Python解释器的惯例外,还有Python程序员通常会遵循的各种其他惯例。例如,本书后面会看见类变量名通常以一个大写字母开头,而模块变量名以小写字母开头。此外,变量名self虽然并非保留字,但在类中一般都有特殊的角色。到了第17章,我们会研究另一种更大类型的变量名,称为内置变量名,这些是预先定义的变量名,但并非保留字(所以,可以重新赋值:open=42行得通,不过有时你可能会希望不能这样做)。

变量名没有类型,但对象有

本部分内容算是对前文的复习,这是让Python的变量名和对象保持鲜明差异的重点所在。如第6章所介绍的,对象有类型(例如,整数和列表),并且可能是可变的或不可变的。另一方面,变量名(变量)只是对象的引用值。没有不可变的观念,也没有相关联的类型信息,除了它们在特定时刻碰巧所引用的对象的类型。

在不同时刻把相同的变量名赋值给不同类型的对象,程序允许这样做:

在稍后的例子中,你会看到变量名的这种通用化的本质,是Python程序设计具有的决定性的优点[2]。第17章会介绍变量名也会存在于所谓的作用域内,作用域定义了变量名在哪里可以使用;对一个名字赋值的地点,决定了它在哪里可见。

注意:要了解其他的命名建议,参见Python的半官方风格指南PEP 8中的"Naming conventions"。可以从http://www.python.org/dev/peps/pep-0008访问该指南,或者通过Web搜索"Python PEP 8"。从技术上讲,这个文档把Python库代码的编码标准形式化了。

尽管很有用,但编码标准通常的缺陷在这里也适用。首先,PEP 8所附带的细节比你在本书中目前为止所了解的要更详细。并且,坦率地说,它变得比需要的更为复杂、严格和主观——其一些建议根本没有被实际工作的Python程序员普遍接受和遵守。此外,当今使用Python的一些最为优秀的公司,它们有自己的不同的编码标准。

然而,PEP 8确实包含了Python知识中的一些有用的规则,并且,对于Python初学者来说,它是很好的读物,只要你把它的推荐当做指南,而不是真理。

[1]不过,在Jython版的Python实现中,用户定义的变量名偶尔可以和Python的保留字相同。参见本书第2章对Jython的概要介绍。

[2]如果你用过像C++这样更加严格限定的语言,可能会想知道,Python中并没有所谓的C++的const声明的概念。有些对象是不可变的,但变量名总是可以赋值的。Python也有些方式可以在类和模块内隐藏变量名,但是和C++的声明并不相同(如果你对隐藏属性感兴趣,可以参阅第24章对_X模块名的介绍,第30章对_X类名的介绍,以及第38章中的Private和Public类装饰器示例)。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文