成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Python 初學者常犯的5個錯誤,布爾型竟是整型的子類

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

Python 是一種高級的動態編程語言,它以易于使用著名。目前 Python 社區已經非常完善了,近幾年它的發展尤為迅猛。但是易于使用同樣能帶來一些壞處,即易于誤用。在本文中,作者列舉了 5 個初學者常犯的錯誤,希望它們能幫助初學者寫更加正確與優美的代碼。

[[275217]]

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)”】 

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

 

責任編輯:趙寧寧 來源: 51CTO專欄
相關推薦

2022-07-22 15:55:32

Python代碼語言

2025-04-07 01:35:00

Go語言程序

2024-05-08 12:41:29

Python編程語言

2024-08-17 12:14:06

2024-06-04 00:00:06

Python初學者優化

2023-01-17 09:27:18

Python語言

2022-10-19 23:18:27

KubernetesPod錯誤

2020-01-14 17:31:46

數據科學誤區人工智能

2024-03-11 18:17:18

Python字符串分隔符

2020-09-06 08:19:11

Python編程語言開發

2018-04-02 11:59:04

Linux命令ln

2020-07-27 13:49:47

Python編程語言開發

2014-01-03 14:09:57

Git學習

2020-03-02 14:20:46

PythonGitHub編程語言

2011-06-17 15:06:14

Qt

2011-07-04 14:14:54

java

2009-09-28 09:45:00

CCNA學習經驗CCNA

2020-09-06 22:04:48

Python運算符開發

2022-10-10 15:28:45

負載均衡

2015-07-20 13:56:59

SDN
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: av一级久久 | 一级毛片免费看 | 亚洲欧美男人天堂 | 国内自拍视频在线观看 | 国产精品一区在线 | 午夜影院在线观看 | 干干干操操操 | 国产精品一码二码三码在线 | 中文字幕一区二区三区精彩视频 | 精品欧美一区二区三区久久久 | 日韩欧美国产一区二区三区 | 国产在线看片 | 精品国产视频在线观看 | 日韩福利在线观看 | 在线观看国产视频 | 亚州精品天堂中文字幕 | 黄色三级免费 | 欧美激情a∨在线视频播放 成人免费共享视频 | 亚洲一二三区免费 | 欧美精品一区三区 | 一区二区国产在线观看 | 欧美日韩在线播放 | 亚洲国产精品91 | 极品在线| 欧美另类视频 | 91精品国产91| 国产1区| 国产黄色小视频在线观看 | 日韩电影免费在线观看中文字幕 | 国产高清在线精品 | 日韩中文欧美 | 98成人网 | 婷婷免费视频 | 国产综合久久 | 一级做a爰片性色毛片视频停止 | 国产精品久久久久久久久久久新郎 | 国产精品视频免费观看 | 日韩精品色网 | 日韩中文字幕一区 | 蜜桃臀av一区二区三区 | 黄色播放 |