当前位置: 首页 > Linux

Python工匠:善用变量提高代码质量

时间:2023-04-06 02:55:15 Linux

1.什么是“Python工匠”?我一直觉得编程在某种意义上是一门“手艺”,因为优雅高效的代码就像一件完美的手工艺品一样赏心悦目。在雕刻代码的过程中,有大项目:比如应该用什么架构,设计模式。还有更多的小细节,比如什么时候使用异常(Exceptions),或者如何命名变量。那些真正优秀的代码,是由无数优秀的细节造就的。《Python工匠》系列文章是我的一个小小的尝试。它专注于分享Python编程中的一些“小”东西。希望对编程道路上的每一位工匠有所帮助。2.变量与代码质量作为《Python工匠》系列文章的第一篇,我想先说说“变量”。因为如何定义和使用变量一直是任何编程语言中首先要掌握的技能之一。变量用得好不好,对代码质量有很重要的关系。在关于变量的众多问题中,为变量取一个好听的名字尤为重要。3.如何命名变量在计算机科学领域,有一句名言(机智):计算机科学中只有两件难事:缓存失效和命名事物。计算机科学领域只有两个难点:缓存过期和给东西命名——PhilKarlton第一个“缓存过期问题”的难点不用多说,用过缓存的人都会明白。至于“命名事物”这第二件事的难点,我也深有体会。在我的职业生涯中度过的最黑暗的下午之一是坐在显示器前挠头,为新项目想出一个合适的名字。编程中最常用的名称是各种变量。给变量起一个好名字非常重要,因为好的变量命名可以大大提高代码整体的可读性。以下几点是我总结的变量命名的基本原则。1、变量名要有描述性,不要太宽泛,在可接受的长度范围内。变量名越准确的描述它指向的内容越好。因此,尽量不要使用那些过于宽泛的词作为变量名称:BAD:day、host、cards、tempGOOD:day_of_week、hosts_to_reboot、expired_cards2。变量名最容易让人猜出类型。学习Python的人都知道,Python是一种动态类型语言,它(至少在PEP484之前)没有变量类型声明。所以当你看到一个变量时,除了从上下文中猜测之外,没有办法轻易知道它是什么类型。但是,人们通常对变量名和变量类型之间的关系有一些直观的约定,我总结如下。》什么样的名字会被当作bool类型?布尔类型变量最大的特点就是只有“是”或“否”两种可能的取值。因此,用黑白两字修饰的变量名如is和has会是一个不错的选择,原则是:让读变量名的人觉得这个变量只能有两个值:“yes”或“no”。这里举几个很好的例子:is_superuser:"Whetherasuperuserornot”,只会有两个值:yes/nohas_error:“是否有错误”,只会有两个值:yes/noallow_vip:“是否允许VIP”,只会有两个values:allow/disallowuse_msgpack:"whethertousemsgpack",只会有两个value:use/notusedebug:"是否开启debug模式",认为是bool主要是因为约定俗成是"whatWhatkindof名称将被视为int/float类型?』当人们看到与数字相关的名称时,他们会默认为int/float类型。以下是比较常见的:所有解释为数字的词,如:port(端口号)、age(年龄)、radius(半径)以_id结尾的词,如:user_id、host_id以length/开头或结尾的词count,如:length_of_username,max_length,users_count注意:不要用普通的复数来表示一个int类型的变量,比如apples,trips,最好用number_of_apples,trips_count代替。其他类型对于str、list、tuple、dict等复杂类型,很难有一个统一的规则让我们通过名称来猜测变量类型。例如headers可以是一个header信息的列表,也可以是一个包含header信息的dict。对于这些类型的变量名,最推荐的方式是编写规范的文档。在函数和方法的文档字符串中,使用sphinx格式(Python官方文档使用的文档化工具)标记所有变量的类型。3.正确使用“匈牙利表示法”我第一次了解到“匈牙利表示法”是在JoelonSoftware的一篇博文中。简而言之,匈牙利命名法是将变量的“类型”缩写,放在变量名的开头。关键是这里说的变量“type”不是指传统意义上的int/str/list的类型,而是指你代码的业务逻辑相关的类型。例如,您的代码中有两个变量:students和teachers,它们都指向一个包含Person对象的列表。使用“匈牙利命名法”后,这两个名称可以重写为:students->pl_studentsteachers->pl_teachers其中pl是personlist的首字母缩写。当变量名有前缀时,如果看到一个以pl_开头的变量,就可以知道它指向的值的类型。在很多情况下,使用“匈牙利表示法”是个好主意,因为它可以提高代码的可读性,尤其是当变量很多并且同一类型多次出现时。请注意不要滥用它。4.保持变量名尽可能短,但不要太短。早些时候,我们提到变量名应该是描述性的。如果你不对这个原则施加任何限制,那么你很可能会写出这个非常具有描述性的变量名:how_much_points_need_for_level2。如果代码中充满了这么长的变量名,对于代码的可读性来说将是一场灾难。一个好的变量名应该有两到三个词长。例如,上面的名称可以缩写为points_level2。在大多数情况下,您应该避免使用只有一两个字母的短名称,例如数组索引三个火枪手i、j、k,最好将它们替换为含义明确的名称,例如persion_index。使用短名称的例外情况有时上述原则会有例外情况。当一些定义明确但较长的变量名重复时,为了使代码更简洁,使用简短的缩写是完全可以的。但是为了降低理解成本,最好不要在同一段代码中使用太多这样的简称。例如,在Python中导入模块时,通常使用短名称作为别名。例如Djangoi18n翻译中常用的gettext方法,通常缩写为_来使用(fromdjango.utils.translationimportugettextas_)5.其他注意事项变量命名其他注意事项:不要在变量名中使用过于相似的变量名同一段代码,比如users、users1、user3同时出现。不要使用带有负面含义的变量名,使用is_special而不是is_not_normal4.改变变量的好用我们讲过如何为变量选择一个好的名字。下面说说日常使用变量时应该注意的一些小细节。1.保持一致性。如果在方法中调用了图片变量photo,其他地方不要改成image。这只会让代码的读者感到困惑:“图像和照片是一回事吗?”?』另外,Python虽然是动态类型语言,但并不代表可以暂时用相同的变量名表示str类型,以后再改成list。相同变量名引用的变量类型也需要保持一致。2.尽量不要使用globals()/locals()也许你在第一次发现globals()/locals()的内置函数时非常兴奋,迫不及待地写下了以下极其“简洁”的内容code:Don’tDothis,它只会让任何读过这段代码的人(包括三个月后的你自己)讨厌你,因为他需要记住这个函数中定义的所有变量(想想这个函数长到两百行如何?),更不用说locals()还传递了一些不必要的变量。更何况,Python之禅(PythonZen)说的很清楚:显式优于隐式。(显式优于隐式)。所以,老老实实把代码写成这样吧:3.变量定义尽可能贴近使用的原则,老生常谈了。很多人(包括我)在刚开始学习编程的时候都有一个习惯。就是把所有的变量定义写在一起,放在函数或方法的最前面。这样做只会让你的代码“看起来很整洁”,而无助于提高代码的可读性。更好的是,让变量定义尽可能接近使用。这样大家在阅读代码的时候,可以更好的理解代码的逻辑,而不是去揣摩这个变量是什么,定义在哪里?4、合理使用namedtuple/dict,让函数返回多个值。Python函数可以返回多个值:但是,这种用法会引起一个小问题:如果有一天,latlon_to_address函数需要返回“District”管理?如果是上面这样写,需要找到所有调用latlon_to_address的地方,把extra变量填进去,否则ValueError:toomanyvaluestounpack会找你:对于这种多返回值function可能会改变,使用namedtuple/dict会更方便。当你添加一个新的返回值时,它对之前的函数调用没有任何破坏作用:但它也有一个缺点,因为代码更兼容变化,但你不能继续使用之前的x,y=f()方法一次解包并定义多个变量。这是你的选择。5.控制单个函数内变量的数量人脑的能力是有限的。研究表明,人类的短期记忆最多只能同时记住十个名字。所以,当你的一个函数太长(一般来说,超过一屏的函数就被认为有点太长了)并且包含了太多的变量。请及时拆分成多个小功能。6、及时删除无用变量的原理,非常简单易行。但如果不遵循它,它可能会对您的代码质量造成毁灭性的影响。这会让阅读你的代码的人感到被愚弄了。所以,请打开IDE的智能提示,及时清理掉那些已经定义但没有使用的变量。7.如果你能定义一个变量,那就不要定义它有时候,当我们定义一个变量时,我们的心理活动是这样的:“好吧,这个值以后可能会被修改/重用”,我们把它定义为一个变量第一!没有必要为了那些可能的变化而牺牲代码当前的可读性。以后如果需要定义变量,以后再添加。5.结语片段看了很多,不知道有多少人能坚持到最后。变量作为编程语言的重要组成部分,在定义和使用变量的时候值得多花一点时间去思考,这会让你的代码变得更好。这是“Python工匠”系列文章的第一篇。看完文章,你有什么不满吗?请留言告诉我。腾讯蓝鲸智云(简称蓝鲸)软件系统是一套基于PaaS的技术解决方案,致力于打造行业领先的一站式自动化运维平台。目前已经推出社区版和企业版,欢迎体验。官网:https://bk.tencent.com/下载链接:https://bk.tencent.com/download/