Python 为什么推荐蛇形命名法原因浅析


Posted in Python onJune 18, 2020

关于变量的命名,这又是一个容易引发程序员论战的话题。如何命名才能更具有可读性、易写性与明义性呢?众说纷纭。

本期“Python为什么”栏目,我们将聚焦于变量命名中的连接方式,来切入这块是非之地,想要回答的问题是——Python 为什么要推荐蛇形命名法?

首先一点,对于单个字符或者单词 (例如:a、A、PYTHON、Cat),当它们被用作变量名时,大致有全小写、全大写和首字母大写这几种情况。编程语言中出现这些情况时,它们基本上跟英语的表达习惯是相同的。

但是,编程语言为了令变量名表达出更丰富的含义,通常需要使用多个单词或符号。 英语习惯使用空格来间隔开单词,然而这种用法在编程语言中会带来一些麻烦,所以程序员们就创造出了另外的方法:

  • 蛇形命名法(snake case)
  • 驼峰命名法(camel case)
  • 匈牙利命名法(HN case)
  • 帕斯卡命名法(Pascal case)
  • 脊柱命名法(spinal case)
  • 自由命名法(studly caps)
  • 驼峰蛇形命名法

总体而言,这些命名法都是要克服单词间的空格,从而把不同单词串连起来, 最终达到创造出一种新的“单词”的效果。

我画了一张思维导图,大略区分了这几种命名法:

Python 为什么推荐蛇形命名法原因浅析

如果按照受众量与知名程度排名,毫无疑问排前两位的是驼峰命名法和蛇形命名法。

我们可以简单比较一下它们的优缺点:

  • 可读性:蛇形命名法用下划线拉大词距,更清楚易读;驼峰命名法的变量名紧凑,节省行宽
  • 易写性:驼峰命名法以大小写为区分,不引入额外的标识符;蛇形命名法统一小写,输入相对方便
  • 明义性:对于某些缩写成的专有名词,例如 HTTP、RGB、DNS等等,一般习惯全用大写表示,但是如果严格遵循这两种命名法的话,须得只留首字母大写或者全小写,这样对原意都会造成一些“破坏”,有时候甚至让人感觉到别扭。如果保留全大写,IDE 可能识别不准,反而会出现波浪提示

由此可见,它们各有优缺点,但哪一方都不具有压倒性。我个人稍微偏好于蛇形命名法,但是在需要用驼峰命名的时候(比如写 Java 时),也能无障碍切换。

需要指出的是,Python 也推荐使用驼峰式命名,那是在类名、Type 变量、异常 exception 名这些情况。而在包名、模块名、方法名和普通变量名 等情况,则是推荐用蛇形命名(lower_case_with_underscores)。

那么,为什么 Python 会推荐用蛇形命名法呢?

最大的原因是历史原因。 蛇形命名方式起源于 1960 年代,那时它甚至还没有特定的名称。Python 从 C 语言中借鉴过来后,给它起名为“lower_case_with_underscores”,即带下划线的小写命名。

直到 21 世纪初的几年,在 Intel 和 Ruby 社区中,才有人开始以“snake_case”即蛇形命名来称呼它。

现今有不少编程语言在某些场景下会推荐使用蛇形命名法,而 Python 则是其中最早这么做的之一,并且是使用场景最多的语言之一。

维基百科上统计了一份清单,可以看出 Python 对它的偏好:

Python 为什么推荐蛇形命名法原因浅析

其次,还有一个比较重要的原因,那就是 Python 对下划线“_”的独特偏爱。

比如类似于 _xx、__xx、xx_、__xx__ 等等的写法就随处可见,甚至还有孤零零一个下划线 _ 作为变量的特殊情况。这样看来,下划线作为单词间的连接,恰恰是这种传统习惯的一部分。

最后,我还看到过一种解释:因为 Python 是蟒蛇啊,理所当然是用蛇形命名……

到此这篇关于Python 为什么推荐蛇形命名法原因浅析的文章就介绍到这了,更多相关Python 蛇形命名法内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python装饰器decorator介绍
Nov 21 Python
Python实现二叉堆
Feb 03 Python
Python基础教程之tcp socket编程详解及简单实例
Feb 23 Python
K-近邻算法的python实现代码分享
Dec 09 Python
解决nohup重定向python输出到文件不成功的问题
May 11 Python
浅述python中深浅拷贝原理
Sep 18 Python
python将一组数分成每3个一组的实例
Nov 14 Python
Flask框架学习笔记之消息提示与异常处理操作详解
Aug 15 Python
浅谈opencv自动光学检测、目标分割和检测(连通区域和findContours)
Jun 04 Python
Python 多线程C段扫描、检测 Ping扫描脚本的实现
Sep 03 Python
全网最全python库selenium自动化使用详细教程
Jan 12 Python
python机器学习实现oneR算法(以鸢尾data为例)
Mar 03 Python
python退出循环的方法
Jun 18 #Python
keras实现多GPU或指定GPU的使用介绍
Jun 17 #Python
Python字符串格式化常用手段及注意事项
Jun 17 #Python
python代码区分大小写吗
Jun 17 #Python
python代码中怎么换行
Jun 17 #Python
Python bisect模块原理及常见实例
Jun 17 #Python
浅谈keras2 predict和fit_generator的坑
Jun 17 #Python
You might like
兼容性最强的PHP生成缩略图的函数代码(修改版)
2011/01/18 PHP
PHP中几个常用的魔术常量
2012/02/23 PHP
PHP处理JSON字符串key缺少双引号的解决方法
2014/09/16 PHP
PHP中使用file_get_contents抓取网页中文乱码问题解决方法
2014/12/17 PHP
Laravel网站打开速度优化的方法汇总
2017/07/16 PHP
浅谈PHP实现大流量下抢购方案
2017/12/15 PHP
用Javascript做flash做的事..才完成的一个类.Auntion Action var 0.1
2007/02/23 Javascript
JavaScript将页面表格导出为Excel的具体实现
2013/12/27 Javascript
轻松实现js图片预览功能
2016/01/18 Javascript
使用 stylelint检查CSS_StyleLint
2016/04/28 Javascript
jQuery Easyui Datagrid实现单行的上移下移及保存移动的结果
2016/08/15 Javascript
浅谈JSON.stringify()和JOSN.parse()方法的不同
2016/08/29 Javascript
KnockoutJS 3.X API 第四章之表单textInput、hasFocus、checked绑定
2016/10/11 Javascript
jQuery将表单序列化成一个Object对象的实例
2016/11/29 Javascript
bootstrap日期控件问题(双日期、清空等问题解决)
2017/04/19 Javascript
微信小程序 跳转传递数据的实例
2017/07/06 Javascript
vue.js数据绑定的方法(单向、双向和一次性绑定)
2017/07/13 Javascript
Vue axios获取token临时令牌封装案例
2020/09/11 Javascript
[06:15]2016国际邀请赛中国区预选赛单车采访:我顶WINGS
2016/06/27 DOTA
python 简易计算器程序,代码就几行
2009/08/29 Python
python实现备份目录的方法
2015/08/03 Python
python logging日志模块的详解
2017/10/29 Python
Pycharm更换python解释器的方法
2018/10/29 Python
python 搜索大文件的实例代码
2019/07/08 Python
解决django中ModelForm多表单组合的问题
2019/07/18 Python
python读取raw binary图片并提取统计信息的实例
2020/01/09 Python
python图形开发GUI库wxpython使用方法详解
2020/02/14 Python
python如何将图片转换素描画
2020/09/08 Python
python使用隐式循环快速求和的实现示例
2020/09/11 Python
英国高街品牌:Miss Selfridge(塞尔弗里奇小姐)
2016/09/21 全球购物
科茨沃尔德家居商店:Scotts of Stow
2018/06/29 全球购物
某公司的.net工程师面试题笔试题
2013/11/22 面试题
毕业生个人求职自荐信
2014/02/26 职场文书
2015年度房地产工作总结
2015/04/09 职场文书
女儿满月酒致辞
2015/07/29 职场文书
什么是clearfix (一文搞清楚css清除浮动clearfix)
2023/05/21 HTML / CSS