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中的yield与generator
Apr 05 Python
python:print格式化输出到文件的实例
May 14 Python
kaggle+mnist实现手写字体识别
Jul 26 Python
详解Numpy中的广播原则/机制
Sep 20 Python
python 列表输出重复值以及对应的角标方法
Jun 11 Python
Python实现Mysql数据统计及numpy统计函数
Jul 15 Python
Python 实现自动获取种子磁力链接方式
Jan 16 Python
基于virtualenv创建python虚拟环境过程图解
Mar 30 Python
Django 删除upload_to文件的步骤
Mar 30 Python
python爬虫容易学吗
Jun 02 Python
Django基于Models定制Admin后台实现过程解析
Nov 11 Python
Python常用GUI框架原理解析汇总
Dec 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
Classes and Objects in PHP5-面向对象编程 [1]
2006/10/09 PHP
PHP遍历某个目录下的所有文件和子文件夹的实现代码
2013/06/28 PHP
ThinkPHP查询中的魔术方法简述
2014/06/25 PHP
Laravel手动分页实现方法详解
2016/10/09 PHP
关于Laravel-admin的基础用法总结和自定义model详解
2019/10/08 PHP
document.getElementById方法在Firefox与IE中的区别
2010/05/18 Javascript
caller和callee的区别介绍及演示结果
2013/03/10 Javascript
用js实现控件的隐藏及style.visibility的使用
2013/06/14 Javascript
Javascript基础知识(二)事件
2014/09/29 Javascript
jQuery数据缓存用法分析
2015/02/20 Javascript
JavaScript深度复制(deep clone)的实现方法
2016/02/19 Javascript
Nodejs中的this详解
2016/03/26 NodeJs
Javascript 实现放大镜效果实例详解
2016/12/03 Javascript
原生js实现倒计时--2018
2017/02/21 Javascript
深入探究AngularJs之$scope对象(作用域)
2017/07/20 Javascript
jQuery图片加载失败替换默认图片方法汇总
2017/11/29 jQuery
小程序中使用css var变量(使js可以动态设置css样式属性)
2020/03/31 Javascript
实现一个Vue自定义指令懒加载的方法示例
2020/06/04 Javascript
Vue自动构建发布脚本的方法示例
2020/07/24 Javascript
ant-design-vue中tree增删改的操作方法
2020/11/03 Javascript
Python、Javascript中的闭包比较
2015/02/04 Python
Python中利用sorted()函数排序的简单教程
2015/04/27 Python
使用Python的内建模块collections的教程
2015/04/28 Python
详解Python中contextlib上下文管理模块的用法
2016/06/28 Python
利用Python+Java调用Shell脚本时的死锁陷阱详解
2018/01/24 Python
python中字符串比较使用is、==和cmp()总结
2018/03/18 Python
详解Python字符串切片
2019/05/20 Python
python实现网页录音效果
2020/10/26 Python
佳能英国官方网站:Canon UK
2017/08/08 全球购物
意大利简约的休闲品牌:Aspesi
2018/02/08 全球购物
会计实习期自我鉴定
2013/10/06 职场文书
保护环境倡议书100字
2014/05/19 职场文书
家长会欢迎标语
2014/06/24 职场文书
传播学专业毕业生自荐书
2014/07/01 职场文书
2014年学生会主席工作总结
2014/11/07 职场文书
2015年入党积极分子培养考察意见
2015/08/12 职场文书