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

发表于:2019-8-29 10:07

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:佚名    来源:机器之心编译

#
Python
  Python是一种高级的动态编程语言,它以易于使用著名。目前Python社区已经非常完善了,近几年它的发展尤为迅猛。但是易于使用同样能带来一些坏处,即易于误用。在本文中,作者列举了5个初学者常犯的错误,希望它们能帮助初学者写更加正确与优美的代码。
  
  1.可变的缺省参数
  Python中的缺省参数会在执行函数定义时计算一次,这表示在函数完成定义后该表达式只执行一次,因此缺省值可以用于后续的每一次调用。如果我们令缺省参数为可变的,例如列表或字典等,那么对于将来所有的调用,该参数都是一直保留且可变的。
  如下为不正确的表达方式,如果我们第一次调用add_item增加「a」时,items=[『a』]。当我们第二次调用add_item增加「b」时,由于定义中的items=[]只在初始化的时候运行一次,因此这时的items=[『a』,『b』]。
  尤其是当我们在调用add_item函数时没传入任何参数,那么items还是能保留以前记住的内容,相当于将以前的内容泄漏给了后续的调用。
   defadd_item(new_item,items=[]):
  items.append(new_item)
  正确的表达方式应该是如下,在我们没传入items时应该要将它初始化为空白列表:
   defadd_item(new_item,items=None):
  ifitemsisNone:
  items=[]
  items.append(new_item)
  2.将assert声明语句作为保证条件
  因为assert语句很容易检查一些条件是否满足或执行是否正确,开发者经常用它来检查某部分代码的有效性。但是当Python解释器调用时带了-O(optimize)flag,那么assert语句会从字节码中移除。所以,如果assert语句在面向用户验证的产品代码中,根本就不会执行,因为它可能会造成一些安全漏洞
  因此开发者应该只在测试中使用assert语句,不正确的示例如下:
 assertre.match(VALID_ADDRESS_REGEXP,email)isnotNone
  正确的代码要改成:
   ifnotre.match(VALID_ADDRESS_REGEXP,email):
  raiseAssertionError
  3.使用isinstance代替type
  type和isinstance都能检查某个对象的类别是什么。但是它们间有非常重要的区别,isinstance在解析目标类型时,它会关注继承关系,而type并不会。正因为这个区别,isinstance在某些时候并不是我们所想的那样。例如以下案例:
   defwhich_number_type(num):
  ifisinstance(num,int):
  print('Integer')
  else:
  raiseTypeError('Notaninteger')
  which_number(False)#prints'Integer',whichisincorrect
  因为布尔类型的变量在Python中是int的子类,isinstance(num,int)同样会得出True,这并不是我们想要的。在特定的类别中,使用type可能更加正确。
  4.不必要的lambda表达式
  函数在Python中是最常用的结构,我们能将函数赋值给某个变量,并将该变量作为参数传递给另外一个函数,这也是函数常见的用法。但这对于初学者或了解其它编程语言的开发者而言,这种传递方式是非常反直觉的。
  一个比较常见的模式可以表示为:
   defrequest(self,method,**kwargs):
  #...
  ifmethodnotin("get","post"):
  req.get_method=lambda:method.upper()
  上面采用匿名函数lambda的方式,最好可以改成以下:
  defrequest(self,method,**kwargs):
  #...
  ifmethodnotin("get","post"):
  req.get_method=method.upper
  #...
  5.NotImplemented错误
  这种命名可能会使开发者感到困惑,NotImplementedError是一种exception类,当派生类需要重写某个方法时,Python应该触发这类错误。而NotImplemented是一个常量,它用于实现二进制操作。当我们触发NotImplemented时,Python会给出「TypeError」的报错。
  错误的例子:
   classSitesManager(object):
  defget_image_tracking_code(self):
  raiseNotImplemented
  正确表达方法应该是:
   classSitesManager(object):
  defget_image_tracking_code(self):
  raiseNotImplementedError

      上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号