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 相关文章推荐
使用Python实现BT种子和磁力链接的相互转换
Nov 09 Python
python实现中文转换url编码的方法
Jun 14 Python
Python中str is not callable问题详解及解决办法
Feb 10 Python
在Django中输出matplotlib生成的图片方法
May 24 Python
python多进程控制学习小结
Oct 31 Python
OpenCV-Python 摄像头实时检测人脸代码实例
Apr 30 Python
python实现五子棋小程序
Jun 18 Python
python2.7的flask框架之引用js&amp;css等静态文件的实现方法
Aug 22 Python
Django Haystack 全文检索与关键词高亮的实现
Feb 17 Python
解决python多线程报错:AttributeError: Can't pickle local object问题
Apr 08 Python
2020版Python学习路线图(附学习资料)
Sep 15 Python
python日志通过不同的等级打印不同的颜色(示例代码)
Jan 13 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
教你IIS6的PHP最佳配置方法
2006/09/05 PHP
php懒人函数 自动添加数据
2011/06/28 PHP
浅析PHP递归函数返回值使用方法
2013/02/18 PHP
微信公众号开发之微信公共平台消息回复类实例
2014/11/14 PHP
php 基础函数
2017/02/10 PHP
yii2的restful api路由实例详解
2019/05/14 PHP
用javascript来实现动画导航效果的代码
2007/12/16 Javascript
script不刷新页面的联动前后代码
2013/09/18 Javascript
javascript中interval与setTimeOut的区别示例介绍
2014/03/14 Javascript
Node.js模块封装及使用方法
2016/03/06 Javascript
JavaScript代码性能优化总结(推荐)
2016/05/16 Javascript
javascript使用btoa和atob来进行Base64转码和解码
2017/03/20 Javascript
Zepto实现密码的隐藏/显示
2017/04/07 Javascript
利用Angular.js编写公共提示模块的方法教程
2017/05/28 Javascript
详解js正则表达式验证时间格式xxxx-xx-xx形式
2018/02/09 Javascript
nodejs(officegen)+vue(axios)在客户端导出word文档的方法
2018/07/31 NodeJs
JavaScript中遍历的十种方法总结
2020/12/15 Javascript
[01:13:08]2018DOTA2亚洲邀请赛4.6 淘汰赛 mineski vs LGD 第二场
2018/04/10 DOTA
python开发的小球完全弹性碰撞游戏代码
2013/10/15 Python
Python IDLE入门简介
2017/12/08 Python
使用python和pygame绘制繁花曲线的方法
2018/02/24 Python
tensorflow入门之训练简单的神经网络方法
2018/02/26 Python
Python实现个人微信号自动监控告警的示例
2019/07/03 Python
python爬虫 基于requests模块发起ajax的get请求实现解析
2019/08/20 Python
Python数组拼接np.concatenate实现过程
2020/04/18 Python
Windows环境下Python3.6.8 importError: DLLload failed:找不到指定的模块
2020/11/01 Python
Python实现随机爬山算法
2021/01/29 Python
西班牙高科技产品购物网站:MejorDeseo
2019/09/08 全球购物
计算机专业个人求职信范例
2013/09/23 职场文书
办理信用卡工作证明
2014/01/11 职场文书
毕业生就业推荐表导师评语
2014/12/31 职场文书
悬空寺导游词
2015/02/05 职场文书
个人求职信格式范文
2015/03/20 职场文书
离婚代理词范文
2015/05/23 职场文书
小学教育见习总结
2015/06/23 职场文书
Android RecyclerView实现九宫格效果
2022/06/28 Java/Android