Python老鸟想告诉新手的事情

最近reddit有个热帖:Senior Python Programmers, what tricks do you want to impart to us young guns? 很多python老鸟分享了自己的奇巧淫技(也不算特别淫),让我学到不少经验和技巧,觉得有必要整理一下。


尽量使用Python3.6,相比Python2.7,Python3.6有了很多提升,比如enums和fstring(实话说,就算只为了fstring我也要换到3.6)。

无比赞同,最近俺们公司的项目也都换到Python3.6了,俺之前写了个git-ext小工具,也随手升级到Python3.6了。

使用.open()和.close()的代码是“有味道”的,尽量使用with代码块(俺写的with文章)。

关于什么是“有味道的代码”,下面有人给出了回复:

有味道的代码指的是,当你去看这块代码的时候,看不出有什么错,但其实是有bug的……简单说就是欠优化的代码。wiki

每一个项目都使用virtualenv,不要在系统的Python上安装任何东西。这样可以保持产品环境独立、可复制。不使用virtualenv就像生活在垃圾场一样。

推荐pipsi,让每一个python工具使用一个独立的env,推荐virtualenv wapper,创建、使用、删除virtualenv从未如此简单。当然下面也有网友推荐了pipenv

使用csv模块来处理CSV文件…… 网友调侃此条说:就是有人喜欢手工处理CSV,“CSV而已,我用逗号分割就好了”成了他们最后的遗言。

不要嵌套生成器表达式,不然代码难以阅读(此条来自Google style guide)。

我觉得嵌套两层尚可。

如果你在循环的时候需要下标,使用enumerate(items)。

如果你用IDE编程,花点时间去学习它的features,特别是如何使用debugger,如何设置断点。

同意,Vim还是IDE,并不重要,重要的是去掌控你的武器。

multiprocessing,而不是threading。

不同意这点,要看情况,反对任何形式的教条主义。俺最近在翻译一本Python并行编程书,大家可以去看看。

用REPL开发特别方便,比如iPython和Jupyter。优点是可以方便地跳转和编辑运行,还有很多魔术方法。如果你经常用REPL的话,还可以试试ptpython和bpython。

理解解包,比如多重赋值: first, second, *_ = (1,2,3,4)。

避免使用 *args和**kwargs,这会让代码更难读,也会让代码自动补全无法工作。除非你确信自己需要这么做。下面有网友支持,即使你需要这样使用,也并不一定使用这两个名字。比如sum(*numbers)就比sum(*args)要好很多,虽然标准库里面用的*args。

这里提一下,Python3已经支持”keyword-only” argument了,如下:

def compare(a, b, *, case_insensitive=False, locale_aware=False)

在所有写代码的地方使用lint工具,例如pyflakes或pylint。它们会强迫你成为更好的程序员。

其实这一条争议比较大,有一规则个人认为比较死板,比如testcase的函数名应该尽量长并且表达出你要测试什么,因为这些test函数永远不会被程序员调用所以长一点也无所谓。另外80个字符也是比较烦。一开始用是好的,但是用了很长时间还需要lint来规范你就不太好了。手中无刀,心中有刀。(Vim用户推荐一下neomake,异步不阻塞)

当你有什么需求的时候,先check一下标准库有没有你想要的东西,如果没找到……再找一遍。还是没找到的话,就去第三方库找一找(有时候github的搜索框比Google还好用)。Python有比较好的生态,大多数痛点都已经有人做了。

itertools和fuctools是你的好朋友,两个模块对一些常见的问题提供了实用的工具。总之,你对标准库越熟悉,你处理问题的方法就会越清晰、越pythonic。

Understand the decorator. Become the decorator.

好吧这句话无法翻译出来意境,之前写过这篇文章,对理解装饰器帮助很大,可以参考一下。

不要称你自己是个Python程序员,不然如果换了一种语言,你就什么也不是了。称自己为“系统工程师”或“Python开发者”或“自动化专家”。

之前我总是不断打开命令行,载入自己写的模块,测试程序。后来我改变了开发模式,先写一个小的单元测试,然后以后开发只通过运行这个测试来调试。即使这个测试并没有真正assert,只有简单的打印。(欢迎加入TDD)

学习单元测试。当你发现你的代码太长,目的不明确的时候,就需要重构了。写出可测试的、清晰的代码。函数应该有明确的目的,入口和返回值。

经常重构代码。这是你让已经工作的代码变得更好的机会。

变量名字使用单词。Good:counter, probe, product; Bad: c, cnt, prb, prdct, obj

理解生成器。尽可能用它。

并不是所有的东西都必须是class。https://www.youtube.com/watch?v=o9pEzgHorH0

尽可能使用absolute import。

理解Python的线程,GIL和multiprocessing

熟悉asyncio。

永远不要用list(任何可变对象都不要用)作为参数默认值。 (foo=[])

It’s not about how complicated you can make it, but how simple you can make it.

That software development isn’t about tricks. It is about process, communication, and application of best practices.

import this. (Python的哲学

不要重复!如果同样的代码写了两次,就说明有更pythonic的方式,比如:

可以写成:

多调研,少写代码。

永远不要假设“问题出在哪”,要确定。

写小的函数。给每个函数一个docstring,确保代码的可读性。

Don’t use pygame, it’ll only break your heart.

阅读:https://docs.quantifiedcode.com/python-anti-patterns/



Python老鸟想告诉新手的事情”已经有4条评论

Leave a comment

您的电子邮箱地址不会被公开。 必填项已用 * 标注