Bootstrap

正确姿势避坑 Python 中的6个典型错误

点击关注我哦

一篇文章带你使用正确姿势避坑 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

;