中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

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

2019-08-27    來源:raincent

容器云強勢上線!快速搭建集群,上萬Linux鏡像隨意使用

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

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

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

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

如下為不正確的表達方式,如果我們第一次調用 add_item 增加「a」時,items=[『a』]。當我們第二次調用 add_item 增加「b」時,由于定義中的 items=[] 只在初始化的時候運行一次,因此這時的 items=[『a』, 『b』]。

尤其是當我們在調用 add_item 函數(shù)時沒傳入任何參數(shù),那么 items 還是能保留以前記住的內容,相當于將以前的內容泄漏給了后續(xù)的調用。

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

正確的表達方式應該是如下,在我們沒傳入 items 時應該要將它初始化為空白列表:

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

2. 將 assert 聲明語句作為保證條件

因為 assert 語句很容易檢查一些條件是否滿足或執(zhí)行是否正確,開發(fā)者經常用它來檢查某部分代碼的有效性。但是當 Python 解釋器調用時帶了-O (optimize) flag,那么 assert 語句會從字節(jié)碼中移除。所以,如果 assert 語句在面向用戶驗證的產品代碼中,根本就不會執(zhí)行,因為它可能會造成一些安全漏洞。

因此開發(fā)者應該只在測試中使用 assert 語句,不正確的示例如下:

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

正確的代碼要改成:

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

3. 使用 isinstance 代替 type

type 和 isinstance 都能檢查某個對象的類別是什么。但是它們間有非常重要的區(qū)別,isinstance 在解析目標類型時,它會關注繼承關系,而 type 并不會。正因為這個區(qū)別,isinstance 在某些時候并不是我們所想的那樣。例如以下案例:

def which_number_type(num):
if isinstance(num, int):
print('Integer')
else:
raise TypeError('Not an integer')

which_number(False) # prints 'Integer', which is incorrect

因為布爾類型的變量在 Python 中是 int 的子類,isinstance(num, int) 同樣會得出 True,這并不是我們想要的。在特定的類別中,使用 type 可能更加正確。

4. 不必要的 lambda 表達式

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

一個比較常見的模式可以表示為:

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

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

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

5. Raising NotImplemented

這種命名可能會使開發(fā)者感到困惑,NotImplementedError 是一種 exception 類,當派生類需要重寫某個方法時,Python 應該觸發(fā)這類錯誤。而 NotImplemented 是一個常量,它用于實現(xiàn)二進制操作。當我們觸發(fā) NotImplemented 時,Python 會給出「TypeError」的報錯。

錯誤的例子:

class SitesManager(object):
def get_image_tracking_code(self):
raise NotImplemented

正確表達方法應該是:

class SitesManager(object):
def get_image_tracking_code(self):
raise NotImplementedError

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

標簽: Python 機器學習

版權申明:本站文章部分自網絡,如有侵權,請聯(lián)系:west999com@outlook.com
特別注意:本站所有轉載文章言論不代表本站觀點!
本站所提供的圖片等素材,版權歸原作者所有,如需使用,請與原作者聯(lián)系。

上一篇:超越云計算:對數(shù)據(jù)庫管理系統(tǒng)未來的思考

下一篇:入門數(shù)據(jù)科學,70% 的人都做錯了