我一直觉得自己学习了很久的​​python​​​,常见的错误不会再犯了,然而就在前几天被狠狠地打脸,一个命名错误让我浪费了20分钟。这里整理一下常见的命名方面的错误。
1.变量名使用​​​python​​内的关键字

a = 3
b = 4
sum = 5
print(sum(a + b))
"""
TypeError: 'int' object is not callable
"""

我们看到这里我们我们给​​sum​​​赋值了一个​​5​​​,而​​sum​​​我们知道是​​python​​​中​​BIF(build-in-functions)​​​中的关键字,​​sum​​​本身是一个可以被调用的函数,但是由于我们给它赋值了​​5​​​,此时的​​sum​​​被编译器认为是一个变量存储着整数类型​​5​​​,而此时我们想要调用​​sum​​​求和函数去计算​​a+b​​​的值就会让编译器很疑惑,从而给出类型错误,整数类型不能够被调用。也就是说我们对​​sum​​​的赋值操作屏蔽了​​sum​​​求和函数本身的功能。
这个问题如果我们采用类就可以被很好的解决,代码如下:

class Debug:
def __init__(self):
self.sum = 5
self.list = [2, 3]

def mainProgram(self):
print(sum(self.list, self.sum))


if __name__ == "__main__":
main = Debug()
main.mainProgram()

我们可以看到,​​sum​​​与​​list​​​均为​​python​​​中的关键字,但是并不会影响我们对​​sum​​​函数本身的调用,因为我们将​​sum​​​与​​list​​​变量定义为了这个​​Debug​​​类的属性,编译器此时是可以将二者区分开的。但是为了养成一个好的习惯,这种方式还是不推荐使用,使用​​self.sum1​​​或者​​self._sum​​​可能会更好。
2.变量名以数字开头

a = [3]
b = 4
3Q = sum(a, b)
print(3Q)
"""
SyntaxError: invalid syntax
"""

我们看到提示语法错误,变量名是不能够以数字开头的
3.脚本​​​.py​​​文件不推荐以数字开头命名
这是因为主程序,也就是当前程序我们用数字开头来命名是没有问题的,比如我们可以命名为​​​2.py​​。但是如果当我们想要在另一个程序中导入这个以数字开头命名的文件时就会报错。特别注意,导入文件时,被导入文件应该与当前文件在同一目录下,然后使用import + 需要被导入的文件名称即可(不包含.py后缀名,加后缀名会报错)。否则应该使用sys模块中的​sys.path.append()​方法添加需要导入文件存在的目录。

import 2
"""
SyntaxError: invalid syntax
"""

我们可以看到编译器就会提示语法错误。因此以数字开头命名脚本文件应该被禁止,不推荐使用。
4.脚本文件名称与已安装模块名称冲突
我们知道用户是可以自己发布包的,如果我们将我们的文件命名成为一个已经安装的模块,那么我们在导入已经安装的模块时,编译器就会疑惑究竟该使用哪一个文件,很有可能造成引用到了我们定义的同名文件,而导致安装的模块无法正常导入。就好比是真假美猴王,长的一模一样,名字也一模一样,就没有办法进行区分了。
5.类名与变量名冲突
这也是上一次导致我浪费了20分钟的问题,开始一直找不到问题,代码如下:

class image3:
def __init__(self, image3):
self.image3 = image3

def mainProgram(self):
print(self.image3)


if __name__ == "__main__":
image3 = [2, 3]
main = image3(image3)
main.mainProgram()
"""
'list' object is not callable
"""

我们可以看到这里我将一个类的名称和一个变量名称重复使用了,就会产生错误,这里的错误很清楚,因为我在​​if __name__ == "__main__":​​​下定义了一个列表​​image3​​​,然后这个​​image3​​​就会屏蔽掉类名​​image3​​​,从而当我想要初始化类​​image3​​​对象的时候,告诉我列表对象不能够被调用。当然也许你们会觉得可笑,但是当代码长起来后,并且参数调用不这么直接时这个错误就没有那么好找出来了,在代码运行的时候当我调用​​image3​​​时,程序就会被引导到比较奇怪的位置,有时候甚至还不会有错误提示。由于我原始的代码比较长,这里就不发出来了,但是我们在定义类的时候一定要避免与我们想要定义的变量名称发生冲突。