专栏首页腾讯NEXT学位Python 工匠:善用变量来改善代码质量

Python 工匠:善用变量来改善代码质量

编程某种意义上是一门『手艺』,因为优雅而高效的代码,就如同完美的手工艺品一样让人赏心悦目。

致“匠人”

在雕琢代码的过程中,有大工程:比如应该用什么架构、哪种设计模式。也有更多的小细节,比如何时使用异常(Exceptions)、或怎么给变量起名。那些真正优秀的代码,正是由无数优秀的细节造就的。

『Python 工匠』这个系列文章,是作者的一次小小尝试。它专注于分享 Python 编程中的一些偏『小』的东西。希望能够帮到每一位编程路上的匠人。

变量和代码质量

作为『Python 工匠』系列文章的第一篇,想先谈谈变量(Variables)。因为如何定义和使用变量,一直都是学习任何一门编程语言最先要掌握的技能之一。

变量用的好或不好,和代码质量有着非常重要的联系。在关于变量的诸多问题中,为变量起一个好名字尤其重要。

如何为变量起名

在计算机科学领域,有一句著名的格言(俏皮话):

There are only two hard things in Computer Science: cache invalidation and naming things.

在计算机科学领域只有两件难事:缓存过期 和 给东西起名字。

-- Phil Karlton

第一个『缓存过期问题』的难度不用多说,任何用过缓存的人都会懂。至于第二个『给东西起名字』这事的难度,作者也是深有体会。在作者的职业生涯里,度过的作为黑暗的下午之一,就是坐在显示器前抓耳挠腮为一个新项目起一个合适的名字。

编程时起的最多的名字,还数各种变量。给变量起一个好名字很重要,因为好的变量命名可以极大提高代码的整体可读性

下面几点,是作者总结的为变量起名时,最好遵守的基本原则。

1. 变量名要有描述性,不能太宽泛

可接受的长度范围内,变量名能把它所指向的内容描述的越精确越好。所以,尽量不要用那些过于宽泛的词来作为你的变量名:

· BAD: day, host, cards, temp

· GOOD: day_of_week, hosts_to_reboot, expired_cards

2. 变量名最好让人能猜出类型

所有学习 Python 的人都知道,Python 是一门动态类型语言,它(至少在 PEP 484 出现前)没有变量类型声明。所以当你看到一个变量时,除了通过上下文猜测,没法轻易知道它是什么类型。

不过,人们对于变量名和变量类型的关系,通常会有一些直觉上的约定,作者把它们总结在了下面。

什么样的名字会被当成 bool 类型?

布尔类型变量的最大特点是:它只存在两个可能的值『是』『不是』。所以,用 is、has 等非黑即白的词修饰的变量名,会是个不错的选择。原则就是:让读到变量名的人觉得这个变量只会有『是』或『不是』两种值

下面是几个不错的示例:

· is_superuser:『是否超级用户』,只会有两种值:是/不是

· has_error:『有没有错误』,只会有两种值:有/没有

· allow_vip:『是否允许 VIP』,只会有两种值:允许/不允许

· use_msgpack:『是否使用 msgpack』,只会有两种值:使用/不使用

· debug:『是否开启调试模式』,被当做 bool 主要是因为约定俗成

什么样的名字会被当成 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,既可能是一个头信息列表,也可能是包含头信息的 dict。

对于这些类型的变量名,最推荐的方式,就是编写规范的文档,在函数和方法的 document string 中,使用 sphinx 格式(Python 官方文档使用的文档工具)来标注所有变量的类型。

3. 适当使用『匈牙利命名法』

第一次知道『匈牙利命名法』,是在 Joel on Software 的一篇博文中。简而言之,匈牙利命名法就是把变量的『类型』缩写,放到变量名的最前面。

关键在于,这里说的变量『类型』,并非指传统意义上的 int/str/list 这种类型,而是指那些和你的代码业务逻辑相关的类型。

比如,在你的代码中有两个变量:students 和 teachers,他们指向的内容都是一个包含 Person 对象的 list 。使用『匈牙利命名法』后,可以把这两个名字改写成这样:

students -> pl_students

teachers -> pl_teachers

其中 pl 是 person list 的首字母缩写。当变量名被加上前缀后,如果你看到以 pl_ 打头的变量,就能知道它所指向的值类型了。

很多情况下,使用『匈牙利命名法』是个不错的主意,因为它可以改善你的代码可读性,尤其在那些变量众多、同一类型多次出现时。注意不要滥用就好。

4. 变量名尽量短,但是绝对不要太短

在前面,我们提到要让变量名有描述性。如果不给这条原则加上任何限制,那么你很有可能写出这种描述性极强的变量名:how_much_points_need_for_level2。如果代码中充斥着这种过长的变量名,对于代码可读性来说是个灾难。

一个好的变量名,长度应该控制在两到三个单词左右。比如上面的名字,可以缩写为 points_level2。

绝大多数情况下,都应该避免使用那些只有一两个字母的短名字,比如数组索引三剑客 i、j、k,用有明确含义的名字,比如 persion_index 来代替它们总是会更好一些。

使用短名字的例外情况:

有时,上面的原则也存在一些例外。当一些意义明确但是较长的变量名重复出现时,为了让代码更简洁,使用短名字缩写是完全可以的。但是为了降低理解成本,同一段代码内最好不要使用太多这种短名字。

比如在 Python 中导入模块时,就会经常用到短名字作为别名,像 Django i18n 翻译时常用的 gettext 方法通常会被缩写成 _ 来使用(from django.utils.translation import ugettext as _)

5. 其他注意事项

其他一些给变量命名的注意事项:

· 同一段代码内不要使用过于相似的变量名,比如同时出现 users、users1、 user3 这种序列

· 不要使用带否定含义的变量名,用 is_special 代替 is_not_normal

结束语

碎碎念了一大堆,不知道有多少人能够坚持到最后。变量作为程序语言的重要组成部分,值得我们在定义和使用它时,多花一丁点时间思考一下,那样会让你的代码变得更优秀。

下周将为大家介绍如何更好地使用变量。

原文作者:腾讯高级工程师 朱雷

来源:腾讯内部KM论坛

  -好课上新-  

「Python从入门到实战」限时特惠

从零开始,开发Wukong-robot

多方位Python体系,满足不同技能需求

本文分享自微信公众号 - 腾讯NEXT学院(Next_Academy)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-04-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 干货 | 认识数据库

    以前对数据库的了解,大概就是一个存放数据的地方,可进行增删查改,更多的就…慢慢学吧。

    腾讯NEXT学位
  • 小游戏内存优化与性能优化

    ? | 导语 听说你的小游戏内存超标?进来了解一下吧。 本文主要跟大家一起来探讨一下Cocos Creator小游戏开发过程中内存优化、性能优化和包体优化。 ...

    腾讯NEXT学位
  • React.JS一点通

    腾讯NEXT学位
  • Python学习教程(五)

    作业(二) 将 “作业(一)” 中的程序块用函数的方式重写,并调用执行 def func(para1,para2,…): func(para1,para2,…)...

    生信宝典
  • 文档处理之行列筛选

    新手小白(就是我),在处理文件的时候发了愁,师兄给了我一个文件,让我先筛选出来diff>0.2 和p <0.05的行列出来,然后根据这个进行秩和检验。 (本来...

    liu_ll
  • R-hier.part包的层次划分方法及重大bug

    近年来,多元回归分析(如广义线性模型,GLMs)在生态学和保护生物学中得到了广泛的应用。然而解释变量之间的多重共线性(相关性),会严重影响这种统计建模方法。

    生物信息知识分享
  • 浅谈用户行为分析之用户身份识别:cookie 知多少?

    对于数据统计分析或者数据挖掘而言,用户是个非常重要的维度,也是统计分析能落地的基础。一般而言,咱们追踪或者识别一个用户的首选方案是 userID,大多数公司的产...

    用户1177713
  • vs链接 SQL server(Visual Studio2015 链接sql server 2014)

    采用sql server 数据库,建立数据 如下: create table person --建立表 ( name char(12), id i...

    东风冷雪
  • Kotlin:Android开发技巧

    Kotlin作为Android开发第一语言,然而身边做Android的大多还是使用java。Android转到Kotlin的趋势是必然的,公司隔壁部门已经全部使...

    haifeiWu
  • 巨头混战,资本加持,互联网家装开启“近身肉搏”

    孟永辉

扫码关注云+社区

领取腾讯云代金券