自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Python 初學(xué)者常犯的5個(gè)錯(cuò)誤,布爾型竟是整型的子類(lèi)

開(kāi)發(fā) 開(kāi)發(fā)工具 后端
Python 是一種神奇的語(yǔ)言,看似簡(jiǎn)單便捷,但總會(huì)有一些意想不到的驚喜在等著我們。比如說(shuō),assert 在正式環(huán)境下根本不會(huì)運(yùn)行,isinstance(False, int) 竟然輸出 True。

Python 是一種高級(jí)的動(dòng)態(tài)編程語(yǔ)言,它以易于使用著名。目前 Python 社區(qū)已經(jīng)非常完善了,近幾年它的發(fā)展尤為迅猛。但是易于使用同樣能帶來(lái)一些壞處,即易于誤用。在本文中,作者列舉了 5 個(gè)初學(xué)者常犯的錯(cuò)誤,希望它們能幫助初學(xué)者寫(xiě)更加正確與優(yōu)美的代碼。

[[275217]]

1. 可變的缺省參數(shù)

Python 中的缺省參數(shù)會(huì)在執(zhí)行函數(shù)定義時(shí)計(jì)算一次,這表示在函數(shù)完成定義后該表達(dá)式只執(zhí)行一次,因此缺省值可以用于后續(xù)的每一次調(diào)用。如果我們令缺省參數(shù)為可變的,例如列表或字典等,那么對(duì)于將來(lái)所有的調(diào)用,該參數(shù)都是一直保留且可變的。

如下為不正確的表達(dá)方式,如果我們第一次調(diào)用 add_item 增加「a」時(shí),items=[『a』]。當(dāng)我們第二次調(diào)用 add_item 增加「b」時(shí),由于定義中的 items=[] 只在初始化的時(shí)候運(yùn)行一次,因此這時(shí)的 items=[『a』, 『b』]。

尤其是當(dāng)我們?cè)谡{(diào)用 add_item 函數(shù)時(shí)沒(méi)傳入任何參數(shù),那么 items 還是能保留以前記住的內(nèi)容,相當(dāng)于將以前的內(nèi)容泄漏給了后續(xù)的調(diào)用。

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

正確的表達(dá)方式應(yīng)該是如下,在我們沒(méi)傳入 items 時(shí)應(yīng)該要將它初始化為空白列表:

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

2. 將 assert 聲明語(yǔ)句作為保證條件

因?yàn)?assert 語(yǔ)句很容易檢查一些條件是否滿(mǎn)足或執(zhí)行是否正確,開(kāi)發(fā)者經(jīng)常用它來(lái)檢查某部分代碼的有效性。但是當(dāng) Python 解釋器調(diào)用時(shí)帶了-O (optimize) flag,那么 assert 語(yǔ)句會(huì)從字節(jié)碼中移除。所以,如果 assert 語(yǔ)句在面向用戶(hù)驗(yàn)證的產(chǎn)品代碼中,根本就不會(huì)執(zhí)行,因?yàn)樗赡軙?huì)造成一些安全漏洞。

因此開(kāi)發(fā)者應(yīng)該只在測(cè)試中使用 assert 語(yǔ)句,不正確的示例如下:

  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 都能檢查某個(gè)對(duì)象的類(lèi)別是什么。但是它們間有非常重要的區(qū)別,isinstance 在解析目標(biāo)類(lèi)型時(shí),它會(huì)關(guān)注繼承關(guān)系,而 type 并不會(huì)。正因?yàn)檫@個(gè)區(qū)別,isinstance 在某些時(shí)候并不是我們所想的那樣。例如以下案例:

  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 

因?yàn)椴紶栴?lèi)型的變量在 Python 中是 int 的子類(lèi),isinstance(num, int) 同樣會(huì)得出 True,這并不是我們想要的。在特定的類(lèi)別中,使用 type 可能更加正確。

4. 不必要的 lambda 表達(dá)式

函數(shù)在 Python 中是最常用的結(jié)構(gòu),我們能將函數(shù)賦值給某個(gè)變量,并將該變量作為參數(shù)傳遞給另外一個(gè)函數(shù),這也是函數(shù)常見(jiàn)的用法。但這對(duì)于初學(xué)者或了解其它編程語(yǔ)言的開(kāi)發(fā)者而言,這種傳遞方式是非常反直覺(jué)的。

一個(gè)比較常見(jiàn)的模式可以表示為:

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

上面采用匿名函數(shù) lambda 的方式,最好可以改成以下:

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

5. NotImplemented錯(cuò)誤

這種命名可能會(huì)使開(kāi)發(fā)者感到困惑,NotImplementedError 是一種 exception 類(lèi),當(dāng)派生類(lèi)需要重寫(xiě)某個(gè)方法時(shí),Python 應(yīng)該觸發(fā)這類(lèi)錯(cuò)誤。而 NotImplemented 是一個(gè)常量,它用于實(shí)現(xiàn)二進(jìn)制操作。當(dāng)我們觸發(fā) NotImplemented 時(shí),Python 會(huì)給出「TypeError」的報(bào)錯(cuò)。

錯(cuò)誤的例子:

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

正確表達(dá)方法應(yīng)該是:

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

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

【本文是51CTO專(zhuān)欄機(jī)構(gòu)“機(jī)器之心”的原創(chuàng)譯文,微信公眾號(hào)“機(jī)器之心( id: almosthuman2014)”】 

戳這里,看該作者更多好文

 

責(zé)任編輯:趙寧寧 來(lái)源: 51CTO專(zhuān)欄
相關(guān)推薦

2022-07-22 15:55:32

Python代碼語(yǔ)言

2025-04-07 01:35:00

Go語(yǔ)言程序

2024-05-08 12:41:29

Python編程語(yǔ)言

2024-08-17 12:14:06

2024-06-04 00:00:06

Python初學(xué)者優(yōu)化

2023-01-17 09:27:18

Python語(yǔ)言

2022-10-19 23:18:27

KubernetesPod錯(cuò)誤

2020-01-14 17:31:46

數(shù)據(jù)科學(xué)誤區(qū)人工智能

2024-03-11 18:17:18

Python字符串分隔符

2020-09-06 08:19:11

Python編程語(yǔ)言開(kāi)發(fā)

2018-04-02 11:59:04

Linux命令ln

2020-07-27 13:49:47

Python編程語(yǔ)言開(kāi)發(fā)

2014-01-03 14:09:57

Git學(xué)習(xí)

2020-03-02 14:20:46

PythonGitHub編程語(yǔ)言

2014-03-12 10:11:57

Python設(shè)計(jì)模式

2011-07-04 14:14:54

java

2009-09-28 09:45:00

CCNA學(xué)習(xí)經(jīng)驗(yàn)CCNA

2015-07-20 13:56:59

SDN

2022-10-10 15:28:45

負(fù)載均衡

2020-09-06 22:04:48

Python運(yùn)算符開(kāi)發(fā)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)