偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

把陷阱去掉了,反倒踩進了新的陷阱?

開發(fā) 前端
相信很多人都知道,Python有一個默認參數(shù)陷阱。函數(shù)的默認參數(shù)不能使用可變類型,否則會導致運行結果跟你想的不一樣。

相信很多人都知道,Python有一個默認參數(shù)陷阱。函數(shù)的默認參數(shù)不能使用可變類型,否則會導致運行結果跟你想的不一樣。例如:

圖片

這段代碼運行的時候,如果傳入了一個列表,那么就往列表里面添加青南和產(chǎn)品經(jīng)理?并用逗號連接起來打印。如果沒有傳入?yún)?shù),就打印青南,產(chǎn)品經(jīng)理??雌饋硭坪鯖]有問題。但如果你不帶參數(shù)多運行幾次,就會發(fā)現(xiàn)問題出來了:

圖片

為什么每次不傳入?yún)?shù)的時候,打印的結果都不一樣?而且越來越長?這個原因我公眾號以前已經(jīng)講過了,根本原因就在于默認參數(shù)user_list=[]?這里的默認值[]是在代碼運行時(Runtime)啟動的時候就初始化的,每次調用函數(shù)一直使用這同一個對象,并不是每次調用函數(shù)的時候初始化。

要解決這個問題也非常簡單,默認參數(shù)使用不可變對象就可以了:

圖片

最近,我在上古代碼中開發(fā)新功能,看到有一段處理Exception的函數(shù),默認參數(shù)就使用的字典。代碼大概長成下面這樣:

def construct_exception(param_dict={}, msg='', extra_msg=''):
"""下面是具體代碼"""

于是我就順手把它改了:

def construct_exception(param_dict=None, msg='', extra_msg=''):
if param_dict = None:
param_dict = {}
"""下面是具體代碼"""

理論上講,我這樣改移除了一個隱患,并且對后面的具體代碼來說,param_dict始終都是一個字典,應該沒有什么問題才對。

結果不久以后,有人給我報Bug。我一看,不就是我改的這個函數(shù)報錯了嗎。一通分析函數(shù)調用棧,發(fā)現(xiàn)了問題的原因。

這個函數(shù)原來是這樣寫的:

def construct_exception(param_dict={}, msg='', extra_msg=''):
"""一些代碼"""
if isinstance(param_dict, dict):
msg = extra_msg.format(**param_dict)
"""其他代碼"""

而上古代碼里面,調用這個函數(shù)的時候,有下面兩種寫法:

exception_msg = construct_exception(param_dict=None, msg='報錯信息')

param_dict = {'code': 123, 'reason': '數(shù)據(jù)庫讀取錯誤'}
exception_msg = construct_exception(param_dict=param_dict, extra_msg='報錯碼是:{code}, 報錯原因:{reason}')

當他用不到param_dict?參數(shù)的時候,他竟然主動傳了個None?進去。這樣一來,他傳入的None?就會被我強制轉換為空字典。于是代碼就會走到extra_msg.format(**param_dict)里面。這個時候由于沒有填充大括號中的參數(shù),于是就報錯了:

圖片

這個新的bug解決起來也簡單,再判斷一下param_dict是不是空就可以了:

def construct_exception(param_dict={}, msg='', extra_msg=''):
"""一些代碼"""
if param_dict and isinstance(param_dict, dict):
msg = extra_msg.format(**param_dict)
"""其他代碼"""

這真的應驗了那句話,當一段顯然有問題的代碼竟然正常運行的時候,你就不要去動他了,它可能處于負負得正的狀態(tài),這一改反而可能把它改錯了。

責任編輯:武曉燕 來源: 未聞Code
相關推薦

2014-07-29 09:16:14

Fragment

2025-02-18 15:17:59

2021-07-08 23:53:44

Go語言拷貝

2020-09-28 13:57:37

區(qū)塊鏈ICOLibra

2023-02-16 12:06:12

2020-10-10 17:34:11

大數(shù)據(jù)IT技術

2023-02-08 16:29:58

前后端開發(fā)

2018-09-30 15:37:07

數(shù)據(jù)庫MySQLMyCat

2021-03-01 15:52:14

開源開源軟件陷阱

2010-07-19 15:49:22

求職陷阱

2010-10-27 11:04:01

招聘

2010-07-28 13:31:10

Flex數(shù)據(jù)綁定

2024-04-29 14:39:20

2019-09-11 10:09:00

Java虛擬機算法

2013-04-17 10:34:55

.NET大對象堆

2009-06-01 14:54:50

jpaapiJava

2017-10-20 10:19:49

Kotlin語言陷阱

2019-07-10 09:12:20

程序員級別跳槽

2010-10-22 15:45:49

無線互聯(lián)

2011-04-14 13:52:27

ArrayList
點贊
收藏

51CTO技術棧公眾號