Python中的下划线详解


Posted in Python onJune 24, 2015

这篇文章讨论Python中下划线_的使用。跟Python中很多用法类似,下划线_的不同用法绝大部分(不全是)都是一种惯例约定。

一、 单个下划线直接做变量名(_)

主要有三种情况:

1. 解释器中

_符号是指交互解释器中最后一次执行语句的返回结果。这种用法最初出现在CPython解释器中,其他解释器后来也都跟进了。

>>> _

Traceback (most recent call last):

  File "", line 1, in 

NameError: name '_' is not defined

>>> 42

>>> _

>>> 'alright!' if _ else ':('

'alright!'

>>> _

'alright!'

2. 作为名称使用

这个跟上面有点类似。_用作被丢弃的名称。按照惯例,这样做可以让阅读你代码的人知道,这是个不会被使用的特定名称。举个例子,你可能无所谓一个循环计数的值:

n = 42

for _ in range(n):

    do_something()

3. i18n

_还可以被用作函数名。这种情况,单下划线经常被用作国际化和本地化字符串翻译查询的函数名。这种惯例好像起源于C语言。举个例子,在 Django documentation for translation 中你可能会看到:

from django.utils.translation import ugettext as _

from django.http import HttpResponse
def my_view(request):

    output = _("Welcome to my site.")

    return HttpResponse(output)

第二种和第三种用法会引起冲突,所以在任意代码块中,如果使用了_作i18n翻译查询函数,就应该避免再用作被丢弃的变量名。

二、 单下划线前缀的名称(例如_shahriar)
以单下划线做前缀的名称指定了这个名称是“私有的”。在 有些 导入import * 的场景中,下一个使用你代码的人(或者你本人)会明白这个名称仅内部使用。Python documentation里面写道:

a name prefixed with an underscore (e.g. _spam) should be treated as a non-public part of the API (whether it is a function, a method or a data member). It should be considered an implementation detail and subject to change without notice.

之所以说在在 有些 import * 的场景,是因为导入时解释器确实对单下划线开头的名称做了处理。如果你这么写from <module/package> import *,任何以单下划线开头的名称都不会被导入,除非模块/包的__all__列表明确包含了这些名称。更多相关信息见““Importing * in Python”。

三、双下划线前缀的名称(例如__shahriar)

以双下划线做前缀的名称(特别是方法名)并不是一种惯例;它对解释器有特定含义。Python会改写这些名称,以免与子类中定义的名称产生冲突。Python documentation中提到,任何__spam这种形式(至少以两个下划线做开头,绝大部分都还有一个下划线做结尾)的标识符,都会文本上被替换为_classname__spam,其中classname是当前类名,并带上一个下划线做前缀。
看下面这个例子:

>>> class A(object):

...     def _internal_use(self):

...         pass

...     def __method_name(self):

...         pass

... 

>>> dir(A())

['_A__method_name', ..., '_internal_use']

正如所料,_internal_use没有变化,但__method_name被改写成了_ClassName__method_name。现在创建一个A的子类B(这可不是个好名字),就不会轻易的覆盖掉A中的__method_name了:

>>> class C(object):

...     def __mine__(self):

...         pass

...

>>> dir(C)

... [..., '__mine__', ...]

还是不要这样写方法名,只让Python定义的特殊方法名使用这种惯例吧。
Python 相关文章推荐
pyramid配置session的方法教程
Nov 27 Python
Python去除列表中重复元素的方法
Mar 20 Python
完美解决python遍历删除字典里值为空的元素报错问题
Sep 11 Python
基于Python的接口测试框架实例
Nov 04 Python
Python IDLE清空窗口的实例
Jun 25 Python
Python实现的多叉树寻找最短路径算法示例
Jul 30 Python
python selenium循环登陆网站的实现
Nov 04 Python
Django使用消息提示简单的弹出个对话框实例
Nov 15 Python
python如何基于redis实现ip代理池
Jan 17 Python
matplotlib交互式数据光标mpldatacursor的实现
Feb 03 Python
python 爬取华为应用市场评论
May 29 Python
OpenCV-Python实现轮廓的特征值
Jun 09 Python
Python装饰器使用实例:验证参数合法性
Jun 24 #Python
Python线程详解
Jun 24 #Python
Python函数式编程指南(四):生成器详解
Jun 24 #Python
Python函数式编程指南(三):迭代器详解
Jun 24 #Python
Python函数式编程指南(二):从函数开始
Jun 24 #Python
Python函数式编程指南(一):函数式编程概述
Jun 24 #Python
web.py在SAE中的Session问题解决方法(使用mysql存储)
Jun 24 #Python
You might like
PHP利用APC模块实现大文件上传进度条的方法
2015/10/29 PHP
php用户登录之cookie信息安全分析
2016/05/13 PHP
JQUERY复选框CHECKBOX全选,取消全选
2008/08/30 Javascript
Javascript的构造函数和constructor属性
2010/01/09 Javascript
JavaScript 原型与继承说明
2010/06/09 Javascript
由点击页面其它地方隐藏div所想到的jQuery的delegate
2013/08/29 Javascript
js取float型小数点后两位数的方法
2014/01/18 Javascript
jQuery中on()方法用法实例详解
2015/02/06 Javascript
javascript实现加载xml文件的方法
2015/11/24 Javascript
jQuery实现放大镜效果实例代码
2016/03/17 Javascript
javascript 继承学习心得总结
2016/03/17 Javascript
详解js数组的完全随机排列算法
2016/12/16 Javascript
JS原生轮播图的简单实现(推荐)
2017/07/22 Javascript
jQuery+vue.js实现的九宫格拼图游戏完整实例【附源码下载】
2017/09/12 jQuery
jQuery实现的事件绑定功能基本示例
2017/10/11 jQuery
微信小程序实现同一页面取值的方法分析
2019/04/30 Javascript
在layui中layer弹出层点击事件无效的解决方法
2019/09/05 Javascript
Vue中通过vue-router实现命名视图的问题
2020/04/23 Javascript
vue项目中微信登录的实现操作
2020/09/08 Javascript
[02:32]DOTA2英雄基础教程 祸乱之源
2013/12/23 DOTA
基于python中的TCP及UDP(详解)
2017/11/06 Python
Python实现App自动签到领取积分功能
2018/09/29 Python
用Python爬取QQ音乐评论并制成词云图的实例
2019/08/24 Python
python实现简单井字棋游戏
2020/03/04 Python
Python实现数字的格式化输出
2020/08/01 Python
Python requests HTTP验证登录实现流程
2020/11/05 Python
css和css3弹性盒模型实现元素宽度(高度)自适应
2019/05/15 HTML / CSS
NARS化妆品官方商店:美国彩妆品牌
2017/08/26 全球购物
找工作最新求职信
2013/12/22 职场文书
市场营销职业生涯规划书范文
2014/01/12 职场文书
红领巾心向党广播稿
2014/01/19 职场文书
幼儿园家长寄语
2014/04/02 职场文书
单位委托书怎么写
2014/08/02 职场文书
我的中国梦演讲稿400字
2014/08/19 职场文书
七年级语文教学反思
2016/03/03 职场文书
Moment的feature导致线上bug解决分析
2022/09/23 Javascript