加入收藏 | 设为首页 | 会员中心 | 我要投稿 河北网 (https://www.hebeiwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

Python 初学者常犯的5个错误,布尔型竟是整型的子类

发布时间:2019-08-29 15:09:30 所属栏目:建站 来源:机器之心编译
导读:Python 是一种高级的动态编程说话,它以易于行使闻名。今朝 Python 社区已经很是完美了,近几年它的成长尤为迅猛。可是易于行使同样能带来一些弊端,即易于误用。在本文中,作者罗列了 5 个初学者常犯的错误,但愿它们能辅佐初学者写越发正确与美妙的代码

Python 是一种高级的动态编程说话,它以易于行使闻名。今朝 Python 社区已经很是完美了,近几年它的成长尤为迅猛。可是易于行使同样能带来一些弊端,即易于误用。在本文中,作者罗列了 5 个初学者常犯的错误,但愿它们能辅佐初学者写越发正确与美妙的代码。

Python

1. 可变的缺省参数

Python 中的缺省参数会在执行函数界说时计较一次,这暗示在函数完成界说后该表达式只执行一次,因此缺省值可以用于后续的每一次挪用。假如我们令缺省参数为可变的,譬喻列表或字典等,那么对付未来全部的挪用,该参数都是一向保存且可变的。

如下为不正确的表达方法,假如我们第一次挪用 add_item 增进「a」时,items=[『a』]。当我们第二次挪用 add_item 增进「b」时,因为界说中的 items=[] 只在初始化的时辰运行一次,因此这时的 items=[『a』, 『b』]。

尤其是当我们在挪用 add_item 函数时没传入任何参数,那么 items 照旧能保存早年记着的内容,相等于将早年的内容走漏给了后续的挪用。

  1. def add_item(new_item, items=[]): 
  2.     items.append(new_item) 

正确的表达方法应该是如下,在我们没传入 items 时应该要将它初始化为空缺列表:

  1. def add_item(new_item, items=None): 
  2.     if items is None: 
  3.         items = [] 
  4.     items.append(new_item) 

2. 将 assert 声明语句作为担保前提

由于 assert 语句很轻易搜查一些前提是否满意或执行是否正确,开拓者常常用它来搜查某部门代码的有用性。可是当 Python 表明器挪用时带了-O (optimize) flag,那么 assert 语句会从字节码中移除。以是,假如 assert 语句在面向用户验证的产物代码中,基础就不会执行,由于它也许会造成一些安详裂痕。

因此开拓者应该只在测试中行使 assert 语句,不正确的示譬喻下:

  1. assert re.match(VALID_ADDRESS_REGEXP, email) is not None 

正确的代码要改成:

  1. if not re.match(VALID_ADDRESS_REGEXP, email): 
  2.     raise AssertionError 

3. 行使 isinstance 取代 type

type 和 isinstance 都能搜查某个工具的种别是什么。可是它们间有很是重要的区别,isinstance 在理会方针范例时,它会存眷担任相关,而 type 并不会。正由于这个区别,isinstance 在某些时辰并不是我们所想的那样。譬喻以下案例:

  1. def which_number_type(num): 
  2.     if isinstance(num, int): 
  3.         print('Integer') 
  4.     else: 
  5.         raise TypeError('Not an integer') 
  6.  
  7. which_number(False)  # prints 'Integer', which is incorrect 

由于布尔范例的变量在 Python 中是 int 的子类,isinstance(num, int) 同样会得出 True,这并不是我们想要的。在特定的种别中,行使 type 也许越发正确。

4. 不须要的 lambda 表达式

函数在 Python 中是最常用的布局,我们能将函数赋值给某个变量,并将该变量作为参数转达给其它一个函数,这也是函数常见的用法。但这对付初学者或相识其余编程说话的开拓者而言,这种转达方法长短常反直觉的。

一个较量常见的模式可以暗示为:

  1. def request(self, method, **kwargs): 
  2.     # ... 
  3.     if method not in ("get", "post"): 
  4.         req.get_method = lambda: method.upper() 

上面回收匿名函数 lambda 的方法,最好可以改成以下:

  1. def request(self, method, **kwargs): 
  2.     # ... 
  3.     if method not in ("get", "post"): 
  4.         req.get_method = method.upper 
  5.     # ... 

5. NotImplemented错误

这种定名也许会使开拓者感想狐疑,NotImplementedError 是一种 exception 类,当派生类必要重写某个要领时,Python 应该触发这类错误。而 NotImplemented 是一个常量,它用于实现二进制操纵。当我们触发 NotImplemented 时,Python 会给出「TypeError」的报错。

错误的例子:

  1. class SitesManager(object): 
  2.     def get_image_tracking_code(self): 
  3.         raise NotImplemented 

正确表达要领应该是:

  1. class SitesManager(object): 
  2.     def get_image_tracking_code(self): 
  3.         raise NotImplementedError 

原文链接:https://deepsource.io/blog/python-common-mistakes/

【本文是51CTO专栏机构“呆板之心”的原创译文,微信公家号“呆板之心( id: almosthuman2014)”】

戳这里,看该作者更多好文

(编辑:河北网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读