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实现代码行数统计示例分享
Feb 10 Python
python回溯法实现数组全排列输出实例分析
Mar 17 Python
用Python写一个无界面的2048小游戏
May 24 Python
python爬虫框架scrapy实战之爬取京东商城进阶篇
Apr 24 Python
python使用正则表达式替换匹配成功的组并输出替换的次数
Nov 22 Python
Python递归实现汉诺塔算法示例
Mar 19 Python
浅谈python numpy中nonzero()的用法
Apr 02 Python
Python实现的NN神经网络算法完整示例
Jun 19 Python
Python实现不规则图形填充的思路
Feb 02 Python
python输出第n个默尼森数的实现示例
Mar 08 Python
python中adb有什么功能
Jun 07 Python
python如何在word中存储本地图片
Apr 07 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数组函数
2008/08/18 PHP
php准确获取文件MIME类型的方法
2015/06/17 PHP
详解yii2实现分库分表的方案与思路
2017/02/03 PHP
PHP实现的装箱算法示例
2018/06/23 PHP
Laravel框架基于中间件实现禁止未登录用户访问页面功能示例
2019/01/17 PHP
PHP使用PDO实现mysql防注入功能详解
2019/12/20 PHP
showModelessDialog()使用详解
2006/09/07 Javascript
比较全的JS checkbox全选、取消全选、删除功能代码
2008/12/19 Javascript
手把手教你自己写一个js表单验证框架的方法
2010/09/14 Javascript
Javascript事件热键兼容ie|firefox
2010/12/30 Javascript
Javascript Web Slider 焦点图示例源码
2013/10/10 Javascript
jquery checkbox实现单选小例
2013/11/27 Javascript
javascript 回到顶部效果的实现代码
2014/02/17 Javascript
使用时间戳解决ie缓存的问题
2014/08/20 Javascript
JavaScript实现强制重定向至HTTPS页面
2015/06/10 Javascript
nodejs加密Crypto的实例代码
2016/07/07 NodeJs
简单实现js点击展开二级菜单功能
2017/05/16 Javascript
基于jQuery实现图片推拉门动画效果的两种方法
2017/08/26 jQuery
js实现加载页面就自动触发超链接的示例
2017/08/31 Javascript
JS实现audio音频剪裁剪切复制播放与上传(步骤详解)
2020/07/28 Javascript
[50:54]完美世界DOTA2联赛 GXR vs IO 第三场 11.07
2020/11/10 DOTA
详解Python中的join()函数的用法
2015/04/07 Python
python多线程方式执行多个bat代码
2016/06/07 Python
redis之django-redis的简单缓存使用
2018/06/07 Python
python实现彩色图转换成灰度图
2019/01/15 Python
对pyqt5之menu和action的使用详解
2019/06/20 Python
Python搭建Keras CNN模型破解网站验证码的实现
2020/04/07 Python
python3 配置logging日志类的操作
2020/04/08 Python
如何基于Python Matplotlib实现网格动画
2020/07/20 Python
python 解决Windows平台上路径有空格的问题
2020/11/10 Python
Mountain Warehouse澳大利亚官网:欧洲家庭户外品牌倡导者
2016/11/20 全球购物
德国隐形眼镜店:LuckyLens
2018/07/29 全球购物
营业员个人总结的自我评价
2013/10/25 职场文书
党员干部四风问题整改措施思想汇报
2014/10/12 职场文书
毕业生个人自荐书
2015/03/05 职场文书
欠条范文
2015/07/03 职场文书