-
python3教程之Python最差实践
本站最新发布 Python从入门到精通|Python基础教程
试听地址 https://www.xin3721.com/eschool/python.html
试听地址 https://www.xin3721.com/eschool/python.html
最近在看一些陈年老系统,其中有一些不好的代码习惯遗留下来的坑;加上最近自己也写了一段烂代码导致服务器负载飙升,所以就趁此机会总结下我看到过/写过的自认为不好的Python代码习惯,时刻提醒自己远离这些“最差实践”,避免挖坑。
下面所举的例子中,有一部分会造成性能问题,有一部分会导致隐藏bug,或日后维护、重构困难,还有一部分纯粹是我认为不够pythonic。所以大家自行甄别,取精去糟吧。
函数默认参数使用可变对象
这个例子我想大家应该在各种技术文章中见过许多遍了,也足以证明这是一个大坑。
先看错误示范吧:
1
2
3
4
5
6
|
def use_mutable_default_param(idx = 0 , ids = []): ids.append(idx) print (idx) print (ids) use_mutable_default_param(idx = 1 ) use_mutable_default_param(idx = 2 ) |
输出:
1
2
3
4
|
1 [1] 2 [1, 2] |
理解这其中的原因,最重要的是有两点:
函数本身也是一个对象,默认参数绑定于这个函数对象上
append这类方法会直接修改对象,所以下次调用此函数时,其绑定的默认参数已经不再是空list了
正确的做法如下:
1
2
3
4
5
6
|
def donot_use_mutable_default_param(idx = 0 , ids = None ): if ids is None : ids = [] ids.append(idx) print (idx) print (ids) |
try…except不具体指明异常类型
虽然在Python中使用try…except不会带来严重的性能问题,但是不加区分,直接捕获所有类型异常的做法,往往会掩盖掉其他的bug,造成难以追查的bug。
一般的,我觉得应该尽量少的使用try…except,这样可以在开发期尽早的发现问题。即使要使用try…except,也应该尽可能的指定出要捕获的具体异常,并在except语句中将异常信息记入log,或者处理完之后,再直接raise出来。
关于dict的冗余代码
我经常能够看到这样的代码:
1
2
3
4
5
6
|
d = {} datas = [ 1 , 2 , 3 , 4 , 2 , 3 , 4 , 1 , 5 ] for k in datas: if k not in d: d[k] = 0 d[k] + = 1 |
栏目列表
最新更新
python数据库连接池技术总结
python数据库连接池技术总结
成人网站性能提升 20 倍之经验谈 [Python
python动态捕获异常
python 探测网站目录的GUI程序
python实现中文字符繁体和简体中文转换
Python服务器开发 -- 网络基础
python高性能编程方法一
使用python管理Cisco设备
python抓取google搜索结果
基于UDP的服务器端和客户端
再谈UDP和TCP
在socket编程中使用域名
网络数据传输时的大小端问题
socket编程实现文件传输功能
如何优雅地断开TCP连接?
图解TCP四次握手断开连接
详细分析TCP数据的传输过程
图解TCP数据报结构以及三次握手(非常详
TCP协议的粘包问题(数据的无边界性)
Excel数据导入到Sql server
SQL Server like 字段
SQL Server中的LEFT、RIGHT函数
sql server 安装出现需要sqlncli.msi文件,错误
SQL Server学习内容(一)
SQLServer执行大脚本文件时,提示“无法执
数据库敏捷版本控制之3个数据库策略
将select 转为json
SQL Server 创建索引(index)
GROUP BY中的WITH CUBE、WITH ROLLUP原理测试及