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

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

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

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

圖片

這段代碼運行的時候,如果傳入了一個列表,那么就往列表里面添加青南和產品經理?并用逗號連接起來打印。如果沒有傳入參數,就打印青南,產品經理。看起來似乎沒有問題。但如果你不帶參數多運行幾次,就會發現問題出來了:

圖片

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

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

圖片

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

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。我一看,不就是我改的這個函數報錯了嗎。一通分析函數調用棧,發現了問題的原因。

這個函數原來是這樣寫的:

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

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

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

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

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

圖片

這個新的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)
"""其他代碼"""

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

責任編輯:武曉燕 來源: 未聞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

區塊鏈ICOLibra

2023-02-16 12:06:12

2020-10-10 17:34:11

大數據IT技術

2023-02-08 16:29:58

前后端開發

2018-09-30 15:37:07

數據庫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數據綁定

2024-04-29 14:39:20

2019-09-11 10:09:00

Java虛擬機算法

2013-04-17 10:34:55

.NET大對象堆

2019-07-10 09:12:20

程序員級別跳槽

2017-10-20 10:19:49

Kotlin語言陷阱

2009-06-01 14:54:50

jpaapiJava

2010-10-22 15:45:49

無線互聯

2011-04-14 13:52:27

ArrayList
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国内av在线 | 国产午夜高清 | 在线免费黄色小视频 | 精品免费国产 | 亚洲成人黄色 | 色狠狠桃花综合 | 精品久久久久久久久久久久久久 | 久久午夜国产精品www忘忧草 | 99综合| 精品欧美一区二区三区久久久 | 视频三区 | 欧美精品久久久久 | 日韩欧美在线视频 | 91高清免费 | 黄色在线免费观看 | 欧美日韩一区二区在线观看 | 久久最新 | 日日摸夜夜爽人人添av | 亚洲一区二区三区高清 | 狠狠操狠狠操 | 国产精品免费视频一区 | 福利视频一区二区 | 国产精品久久久久久久久免费相片 | 中文字幕一区二区三区精彩视频 | 亚洲毛片 | 伊人伊人 | 黄色av网站在线观看 | 亚洲协和影视 | 欧美一区二区三区在线 | 一区二区在线 | 亚洲国产成人av好男人在线观看 | 欧美伊人久久久久久久久影院 | 欧美大片在线观看 | 国产成人免费视频网站高清观看视频 | 九色 在线 | www在线视频 | 国产视频在线一区二区 | 欧美色视频免费 | 日日碰狠狠躁久久躁婷婷 | 久久久精品一区二区三区 | 国产精品视频偷伦精品视频 |