上古代码漫游记(二):把陷阱去掉了,反倒踩进了新的陷阱?
摄影:产品经理
炸牛奶
两个月之前,我写了一篇文章《长见识,让大家看看什么是垃圾代码》,不少同学都表示长见识了。今天我们再来看另外一个问题。
相信很多人都知道,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 is 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=None, msg='', extra_msg=''):
"""省略前面的代码"""
if param_dict and isinstance(param_dict, dict):
msg = extra_msg.format(**param_dict)
"""其他代码"""
这真的应验了那句话,当一段显然有问题的代码竟然正常运行的时候,你就不要去动他了,它可能处于负负得正的状态,这一改反而可能把它改错了。
END
相关文章
- Jgit的使用笔记
- 利用Github Action实现Tornadofx/JavaFx打包
- 叹息!GitHub Trending 即将成为历史!
- 微软软了?开源社区讨论炸锅,GitHub CEO 亲自来答
- GitHub Trending 列表频现重复项,前后端都没去重?
- Photoshop Elements 2021版本软件安装教程(mac+windows全版本都有)
- (ps全版本)Photoshop 2020的安装与破解教程(mac+windows全版本都有)
- (ps全版本)Photoshop cc2018的安装与破解教程(mac+windows全版本,包括2023
- 环境搭建:Oracle GoldenGate 大数据迁移到 Redshift/Flat file/Flume/Kafka测试流程
- 每个开发人员都要掌握的:最小 Linux 基础课
- 来撸羊毛了!Windows 环境下 Hexo 博客搭建,并部署到 GitHub Pages
- 超实用!手把手入门 MongoDB:这些坑点请一定远离
- 【GitHub日报】22-10-09 zustand、neovim、webtorrent、express 等4款App今日上新
- 【GitHub日报】22-10-10 brew、minio、vite、seaweedfs、dbeaver 等8款App今日上新
- 【GitHub日报】22-10-11 cobra、grafana、vue、ToolJet、redwood 等13款App今日上新
- Photoshop 2018 下载及安装教程(mac+windows全版本都有,包括最新的2023)
- Photoshop 2017 下载及安装教程(mac+windows全版本都有,包括最新的2023)
- Photoshop 2020 下载及安装教程(mac+windows全版本都有,包括最新的2023)
- Photoshop 2023 资源免费下载(mac+windows全版本都有,包括最新的2023)
- 最新版本Photoshop CC2018软件安装教程(mac+windows全版本都有,包括2023