前言
Python有很多语法糖,这些语法糖可以让我们通过简短的代码实现相应的功能。
我曾经痴迷于使用各种各样的语法糖,力求以最简短的代码实现相应的功能(代码量最少),这让我觉得自己很Geek,很Pythonista,但现在我觉得这是一种错误的做法。
浮于表面的「简短」
下面代码可以实现完全相同的功能,你会喜欢那种写法?# 写法一:利用列表生成式
result = [(x, y) for x in range(5) for y in range(10) if x * y > 20]
# 写法二:简单的多层循环
# 正确示例
result = []
for x in range(5):
for y in range(10):
if x * y > 20:
result.append((x, y))
曾经的我会毫不犹豫的选择写法一,觉得这种写法很Geek,可以凸显出我对Python的熟练运用,但写法一的代码在可读性方面并不友好,这种简短是浮于表面的。
真正的简短应该建立在程序语义明确的基础上,要让阅读你代码的人可以一眼就明白你想通过这段代码表达什么。
在语义明确的基础上,再去简化代码,去除冗余,将绕弯子的逻辑删除,力求最简单的方式表达自己的思想。
真正的简短是思维层面的优化,而不是利用各种花哨的语法糖将其代码量缩短。王垠博客对这种现象给出了一个非常形象的描述:「就像是整理一团电线,并不是把它们揉成一团然后塞进一个盒子里就好。这样的做法只会给你以后的工作带来更大的麻烦,而且还有安全隐患。」
表面简短的代码除了让人不好理解外,编写的人也容易写出bug而不自知,此外也让人难以debug,从而导致需要花费更多的时间才能定位报错原因。
记住一个原则:「阅读者的体验 > 编程者的体验 > 机器的体验」
在开发项目的过程中,真正写代码的时间要远小于阅读代码与debug的时间,所以将代码写的语义清晰才是最重要的,其次才是在此基础上的优化。
大多数时候使用大量的语法糖只是为了炫技,这可能是每个年轻程序员都会经历的「编程幼稚期」。当然,有些老油条为了增加自己的“不可替代性”特意将代码写的让人难以理解,这就另说了。
有意义的变量名
有意义的变量名是让程序语义清晰的重要前提。
100行代码里面全是a,b,c,d这样的变量,会让人看吐,而100行代码中,其变量命名全都是具有意义的,那么看起来就会很轻松,此时变量名本身就带有一定的信息量,从而帮助我们更好更快的理解代码。
适度使用Python黑魔法
Python动态语言的特性让其具有很多「骚气」的写法,这些写法可能在Java这类语言中是难以实现的,而在Python中却可以轻松写出,这些黑魔法是一柄双刃剑,要适度使用(当然Java也有很多骚写法,同样要适度使用)。
怎么样算适度?
阅读多个Python开源库,就可以发现,Python中很多高级用法只会用于底层架构实现上(比如元类、具有复杂逻辑的装饰器),通过对底层逻辑的封装,避免这些难以理解的代码直接暴露于应用层接口中。
这样既保持了底层代码的干净又避免应用层代码让人难以理解。
作为普通程序员,最常接触的就是应用层层面的各种业务逻辑开发,此时就要避免使用Python高级语法,力求做到代码语义清晰,让人一眼就明白。
底层框架的设计大道相同,实现方式也类似,底层就算利用Python高级语法,也可以理解。而业务逻辑不同,不同的业务其对应的代码千差万别,如果大量的使用语法糖会让人难以理解、出现问题、难以debug,此时最好通过最朴素的写法来完成相应的业务逻辑,保证语义上的清晰。
结尾
最近在阅读公司Python项目的代码,有感而发。
希望大家早日脱离靠语法糖炫技的日子,找到其他可以证明自己价值、证明自己不可被轻易代替的方法。
如果觉得对你有帮助、有价值,请点击「在看」,支持二两。
参考:程序语言的常见设计错误(1) - 片面追求短小