| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Python知识库 -> [EuroPython2021笔记] Python反面模式 -- 用空格的比用tab的收入高 -> 正文阅读 |
|
[Python知识库][EuroPython2021笔记] Python反面模式 -- 用空格的比用tab的收入高 |
本文是Euro Python 2021大会演讲Python Anti-Patterns的学习笔记。这篇演讲的作者是Vinicius Gubiani Ferreira。 英文简介
翻译
作者简介 Vinicius Gubiani Ferreira 是AZION的高级后端开发工程师。AZION是一家severless and 边缘计算公司,致力于让网络更快,更安全。他也是python的葡萄牙语的翻译者。业余爱好有喝啤酒,骑自行车等。 (中国人一定会装逼的说,我喜欢文学,艺术,我知道茴香豆的茴字有100种写法。。。) 通用反面模式首先,我们要明白什么是模式,模式就是针对反复出现的问题的通用的解决方案。至少出现三次才叫反复出现。模式会被大规模的采用。可以认为是一种内聚方法。模式是可靠,高效的。 而反面模式一开始看起来挺好,直到出现问题。有时候,反面模式不仅不能解决问题,反而会引发更大的问题。 《Anti-Patterns》这本书,介绍了三种反面模式:
Boat Anchor 船锚, 是指哪些已经不需要的废代码。这里的解决方案就是尽快删除它们。 Spaghetti Code 意大利面代码,指那些没有结构和清晰度的代码。这些代码很难维护。解决的方法就是重构。 God Code 上帝代码,看起来有一些结构。但是有限。比如,一个文件500行代码。解决的方法就是拆分。之后就会易于维护了。 Vendor Lock-in 供应商锁定, 代码逻辑对特定供应商的依赖太重。有一天,我们决定不在使用这个供应商了。这时候,我们的麻烦就大了。解决的方法是,抽象出一个抽象层。我们的代码只和抽象层打交道。当供应商换了。我们只需要重写抽象的具体实现。上层建筑无需更改。 Cargo Cult Programming 盲目信仰, 有人从Stackoverflow复制了一段代码,还没看明白,就盲目的放到项目里了,出了问题也不知道怎么回事。解决的方案就是,要明白自己的代码要干什么。要花时间去看懂。 Premature optimization 不成熟的优化, 有人说他是万恶之源(The root of all evil), 97%的情况,我们不需要优化。解决的方法就是先要找出性能的指标和瓶颈。如果我们做不成熟的优化,那么我们的代码会变得没有必要的复杂。 Magic Numbers 魔术数字, 他们看起来完全随机,但是如果我们改了这些数字,就会引发很多奇怪的bug。两个解决方案,要么加上注释。或者使用枚举。 Gold plating 镀金, 开发一些客户不需要的功能。解决的方法就是开会,开会,开会。 (我怀疑你一个程序员,能推翻项目经理的决定么?) Python 反面模式没有异常类型Bad code sample
Good code sample
我们不应该捕获了所有异常,然后假装无事发生。我们应该把异常记录下来,不然我们就不知道发生了什么。我们尤其应该捕获特定的异常,而不是所有异常。 处理文件时不使用内容管理器Bad code sample
Good code sample
当我们读写文件的时候,我们可能发生任何错误。如果我们不将数据写入文件(关闭文件),数据可能会丢失,文件也可能会被污染。用了内容管理器,无论是否异常,文件都会被关闭。 (在.py文件中,我一定会使用内容管理器。只有在jupyter notebook中,我才会省略内容管理器。我的习惯是在jupyter notebook探索,当然探索的代码都不是正式代码。等探索跑通了,在写成正式的python文件。) 返回多种类型Bad code sample
Good code sample
如果有多种返回类型,会难为维护。最好只使用一种类型返回,空值或者找不到数据可以抛异常。 在类的外面使用被保护的成员对象Bad code sample
Good code sample
在其他语言中,被保护的成员,在外部是无法被访问的。但是python里面,你还是可以访问。不过,这并不代表你就应该去访问。还是应该遵守软件开发的基本守则。 应该实现公共的getter和setter。 使用关键字Bad code sample
Good code sample
更夸张的是,你居然可以赋值给关键字,或者已经使用的名字。这样做可能对整个系统造成不可预料的破坏。 使用tab,甚至tab和空格混合Bad code sample
Good code sample
(PEP 8里面说了,使用4个空格来缩进代码。如果你不遵守,说明你没读PEP 8。我给你个链接,你去读读吧。) 用空格的程序员比用tab的程序员每年多2万美元工资。 这里有一篇stackoverflow的文章,这这么说的。 https://stackoverflow.blog/2017/06/15/developers-use-spaces-make-money-use-tabs/ For…ElseBad code sample
Good code sample
上面的bad code就是我们通常的写法,在其他语言里,我们都会这样写。不过,python有更好的解决方案,就是在for后面跟一个else,如果for循环执行完毕,没有跳出,则执行else。 (我看到这里有些头大,我经常看欧美的程序员大叔的视频,每一个人说到这里的时候,都不建议使用For…Else。在他之前,我应该遇到3个人专家,反对for…else了。反正我不会用For…else。你用不用,随你。很多时候,尤其在中国,因为项目的需要,老板随便叫两个人来,就让你维护python代码了,他不管你们有没有学过python。写For…Else是为难后面的程序员,所以我不写。当然,也指不定哪天,我“想通”了。这个是争议话题。我觉得,老师在介绍争议话题的时候,应该介绍反面的观点。而不是灌输和一言堂。) 不用get()获取默认值Bad code sample
Good code sample
Python的原则是easier to ask forgiveness than permission 而Java的原则是look before you leap。 后面的代码看起来舒服多了。 用通用符引用所有成员Bad code sample
Good code sample
如果你引用几个库,那么这几个库里面很可能有同名成员,那你就麻烦大了。 使用全局变量Bad code sample
Good code sample
尽量避免使用全局变量 用一个字符命名变量Bad code sample
Good code sample
尽量使用有明确含义的名字,而不是模棱两可的名字。 错误的比较方法Bad code sample
Good code sample
如果要检查一个值是否为True,只需要把这个值直接作为条件即可。比较的时候,有 == 运算符 和 is 运算符,他们的含义并不一样。True 等于 1 ,但是True不是1。所以 True == 1 返回 True,True is 1 返回 False。 用type比较类型Bad code sample
Good code sample
isinstance会检查一个变量的类型以及其所有的父类。而直接比较type,比较的是当前的类。 (这里我没看出来bad code哪里不好了,如果它的目的是比较两个形状是不是同样的形状,那么我认为它可以这样写。) 函数返回值没有使用named tupleBad code sample
Good code sample
不区分单复数作者并没有提到这个,但是我发现这点是中国程序员常犯的错误。 Bad code sample
Good code sample
上面的错误代码中,list不区分单复数。以至于到了要遍历list的时候,只能在sheep前面加i了。我的做法是,尽量区分单复数,当单复数同形的时候,复数就叫xxx_list,单数还叫xxx。 引用大会页面: https://ep2021.europython.eu/talks/yXoQCzR-python-anti-patterns/ 视频地址(优酷): https://v.youku.com/v_show/id_XNTgxMTU5NjEwOA==.html PDF地址: https://ep2021.europython.eu/media/conference/slides/yXoQCzR-python-anti-patterns.pdf 《Python反面模式小册子》: |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/15 17:43:37- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |