已发“坑”请参考Python函数默认值参数的2个坑,Python编程中一定要注意的那些“坑”(一),Python编程中一定要注意的那些“坑”(二),Python中一定要注意的那些“坑”(三),Python编程一定要注意的那些“坑”(四).
今天来说说变量、函数、类等标识符以及程序文件命名应该注意的“坑”。
(1)变量、函数、类等标识符命名
这些标识符命名时遵循的原则基本上是一致的:1)必须以字母或下划线开头;2)不能包含空格和标点符号;3)不能使用Python关键字作为标识符的名字;4)英文字母区分大小写;5)不建议使用内置函数的名字、标准库或扩展库的名字、标准库或扩展库中对象的名字来作为标识符名字。
上面的命名规则其他几条还算容易理解,最后一条是必须要注意的,如果不小心很容易中埋伏出现错误,而这样的错误是非常难以发现的。以内置函数为例,Python允许自己在编写代码时使用内置函数名作为变量名,但这会改变内置函数名的含义,从而影响后面对其调用的代码。例如:
>>> id(3)
1599775904
>>> id = 5
>>> id(3)
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
id(3)
TypeError: 'int' object is not callable
上面代码中,第一次是调用内置函数id()来查看对象3的内存地址,但后面的代码错误地把id作为自己的变量名,从此以后,id再也不是原来的内置函数id(),而是一个普通的整数5(但这个操作并不影响其他内置函数的使用),所以接下来执行id(3)试图查看对象3的内存地址就会发生错误,因为现在和执行语句5(3)是一样的意思,很明显整数5不是可调用对象,所以抛出异常。
(2)程序文件命名
肯定有人会说,我自己编写的程序,爱起什么文件名就起什么文件名,这事你也管得着?我是管不着的,但是Python能管得着。
Python在启动时会导入很多标准库,而程序运行时会导入很多标准库和扩展库,而导入时对程序文件的查找顺序是优先考虑当前文件夹,如果找不到就会去sys.path变量所指定的路径中去查找。那么问题来了,如果我们把自己的程序文件起的名字和Python标准库或某个扩展库的名字相同会怎么样呢?那就会优先导入这个自己编写的文件(有安全经验的朋友可以查查DLL劫持的有关内容)。如果我们自己编写的文件不符合要求或没有提供所必需的接口,就会影响程序后续代码的运行,甚至会影响Python解释器的工作。例如,我们把自己的程序文件名命名为threading,就会发现IDLE无法启动了。