点击关注我哦
一篇文章带你使用正确姿势避坑 Python 中的6个典型错误
Python是一种高级的动态脚本语言。它易于使用的特性使得它非常流行,并且在最近几年得到了扩展。易用性也从易滥用开始。我们列出了初学者在编写python程序时可能犯的典型错误。
1:用isinstance代替type
type和isinstance均可用于验证Python对象类型。但是,这是一个显着的区别:在解决对象类型时,isinstance确保继承,而type则不保证继承。而且它可能不是您经常要用于实例的对象。请参考下图:
def the_number_type(num):
if isinstance(num, int):
print('Integer')
else:
raise TypeError('Not an integer')
the_number(False) # prints 'Integer', that is incorrect
上面,由于bool是Python中int的子类,因此isinstance(num,int)也被视为True,这不是我们想要的。对于这种特殊情况,使用type是正确的方法。在此处详细了解这两种方法的行为差异。
2:可变的默认参数
在Python中,有两种类型的对象。在运行时,可变对象可以更改其状态或内容,而不可变对象则不能。大多数内置对象类型都是不可变的,包括int,float,string,bool和tuple。
执行函数定义后,将检查默认的Python参数一次。这意味着在定义函数时仅对表达式进行一次检查,并且对于每个后续调用都使用相同的值。但是,如果您更改了可变的默认参数(列表,字典等),则所有后续调用都会更改它。
错误:
def add_element(new_element, elements=[]):
elements.append(new_element)
正确:
def add_element(new_element, elements=None):
if elements is None:
elements = []
elements.append(new_element)
3:Raising NotImplemented
这是相同命名可能误导开发人员的一种情况。NotImplementedError是一个异常类,如果需要派生类,则应创建该类以重写方法。NotImplemented是用于二进制运算符的常量。引发NotImplemented时将创建TypeError。
错误:
class SalesOfficer(item):
def get_image_tracking_code(self):
raise NotImplemented
正确:
class SalesOfficer(item):
def get_image_tracking_code(self):
raise NotImplementedError
4:不必要的lambda表达式
Python中的函数是一等公民。这意味着您可以将其指定给某个变量,将其作为参数传递给另一个函数,等等。对于其他编程语言的初学者或开发人员来说,这可能是违反直觉的。
一个典型的例子如下:
def request(self, method, **kwargs):
# ...
if method not in ("get", "post"):
req.get_method = lambda: method.upper()
# ...
编写此代码的正确方法是:
def request(self, method, **kwargs):
# ...
if method not in ("get", "post"):
req.get_method = method.upper
5:不会使用迭代器
每个Python初学者都会这样做,而不管他们在其他编程语言方面的专业知识如何。没有例外。
使用列表list_,您将如何使用for循环依次访问列表中的项目?我们知道Python列表已建立索引,因此我们可以使用list_ [i]访问第i个项目。然后,我们可以为for循环构建一个从0到len(list_)范围内的整数的Iterator,如下所示:
for i in range(len(list_)):
foo(list_[i])
这确实起作用。没有代码问题。这也是用其他语言构造for循环的一种常用方法。但是在Python中,我们有更好的方法。
通过利用Python的iterable标识,开发人员可以创建更简便的代码:
for item in list_:
foo(item)
6: 使用全局变量
全局变量在主脚本中作为变量名列出,而局部变量在具有局部作用域的函数中作为变量名列出。使用Python的global关键字,您可以在本地访问全局变量,并在函数中进行本地修改。下面是一个典型的例子:
k = 1 # a variable
def add1():
k+= 1
return k
def add2():
global k# can make changes to global variable "k"
k+= 1
return k
add1() # UnboundLocalError: local variable 'k' referenced before assignment
add2() # returns 2
虽然许多新手喜欢它,因为似乎使用Global可以避免传递函数的所有参数。但实际上这是不对的。它只是掩盖了行为。
global的使用也不利于调试。函数应该作为块框架处理,并且应该是可重用的。更改全局变量的函数可能很难检测到主脚本的副作用,并且可能会触发复杂的意大利面式的代码,从而使调试更加困难。
更改全局变量是局部函数中有缺陷的编程方法。您可以将变量作为参数传递,更改并在函数末尾返回。
结论
这还远远不够,因为互联网上几乎没有任何完整的常见错误列表。我希望这篇文章向您展示了您正在处理的至少一个Python常见错误,并希望它能够使您编写正确而直观的代码。
· END ·
HAPPY LIFE