Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发。
除非你在唱摇滚,否则人们不会完全使用成语。滥用成语可能会让你看上去不只是充满自信、中气十足,坦白点说就是在搞笑。说话的时候时不时加一些成语非常正常,但从头到尾都用成语就有点跑题了。
我想表达的意思是,将你碰巧学到的成语填充到文字中并不会增加多少可读性,对代码来说亦然。
Jeff Knupp写过一本名为“Writing Idiomatic Python”的书。该书对Python中的惯用法进行了整理,还整合了一些不是很出名的语言特性及其实践。尽管作为一本字典或者动物寓言集,它还是很有用,但也促进了使用惯用法会使代码变得更好这种危险的谬误的传播。
也许你觉得我在危言耸听,以下是本书的节选:
每个惯用法都包含一个例子来展示使用惯用法的代码以及有害的代码。大多数情况下,被列入有害的清单并不意味着以这种方式编程会带来很多问题。相反,它只是一个不使用惯用法编程的例子。你可以使用有害的案例作为模板来查找你的代码。当你发现这样的代码时,用惯用法版本的替换掉它们吧!
图名:-用惯用法么?-用。
然而,即使在这样特定的一本书中,也有些例子运行的不是很好。例如:
这是一个很简单的函数,但由于不必要的惯用法导致需要进行注释。如果不是所有元素都是可迭代的,则它们包含0?这是什么鬼?使用标准语言就能使整个函数再次变得易读。
如果容器中有一个0,则容器包含0。就是这么简单;它甚至都不需要定义一个函数,更别说加一个注释了。
还有一个例子:
当一个或多个机器人攻击时举起盾牌。嗯,这个没什么毛病。不过既然逻辑这么清晰,为什么代码不写的直接点呢?
简单的三个符号,使得函数对读者来说完全透明了。后面也不需要再注释。
遵循一些原则会自动让你成为更好的开发者这样的想法固然很迷人。但只是这么做也未必有用。重要的不是这些原则,而是把握遵守这些原则的时机。
接着看一些例子。
一、必要的时候使用较长的描述性名称
修改前:
修改后:
二、可能的时候使用较短的助记符名称
修改前:
修改后:
三、为了清晰使用分解通用名词来代替注释
修改前:
修改后:
四、不要再阐明已经足够清晰的代码
修改前:
修改后:
五、使用列表生成式来转换列表
修改前:
修改后:
六、使用列表生成式你可以做任何事,但并不意味着你应该用
修改前:
修改后:
结论
我希望你们能看到这个模式。每条偶数的原则看上去和奇数的都相悖。但也只是看上去是这样而已,所有的原则都要根据实际情况来确定。这就是我想说的。编写好代码的关键不是原则,如果是的话我们早就自动实现了。最关键的就是上下文环境。
不幸的是,这也意味着你无法仅仅通过遵循一些原则就能写出好代码。这样的想法确实很吸引人,但是却行不通。了解一些编程惯用法和最佳实践毫无疑问是有用的,但不应该到此为止。你必须超越编程惯用法、超越这些原则。
据我所知,想提高编程技巧只有一条捷径,但它过于直白且缺少吸引力,没有人会为这些专门写一本书。也没人会在会议上宣传它。博客文章很少有关于这个话题的,但它们在很大程度上被忽视了。
唯一有用的这种方法就是:
想要写出好代码,你需要先写出几吨垃圾代码。
这就是诀窍了。犯错,然后从中学习。你是一个程序员,不是医生或者赛车手。你可以承担的起在错误中不断成长,其他人也不会因此受到伤害。
这是一个特权,享受它吧!
英文原文:https://ogmcsrgk5.qnssl.com/vcdn/1/%E4%BC%98%E8%B4%A8%E6%96%87%E7%AB%A0%E9%95%BF%E5%9B%BE/going-beyond-the-idiomatic-python-a321b6c6a5e6.png
译者:woody