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 相关文章推荐
Python3实现将文件归档到zip文件及从zip文件中读取数据的方法
May 22 Python
Python3实现将文件树中所有文件和子目录归档到tar压缩文件的方法
May 22 Python
Python守护进程用法实例分析
Jun 04 Python
Python安装Flask环境及简单应用示例
May 03 Python
Django中URL的参数传递的实现
Aug 04 Python
利用Python脚本批量生成SQL语句
Mar 04 Python
python对XML文件的操作实现代码
Mar 27 Python
Python HTMLTestRunner库安装过程解析
May 25 Python
容易被忽略的Python内置类型
Sep 03 Python
Python通过getattr函数获取对象的属性值
Oct 16 Python
详解python的super()的作用和原理
Oct 29 Python
Python接口自动化系列之unittest结合ddt的使用教程详解
Feb 23 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面向对象学习笔记之二 生成对象的设计模式
2012/10/06 PHP
PHP Error与Logging函数的深入理解
2013/06/03 PHP
PHP实现发送邮件的方法(基于简单邮件发送类)
2015/12/17 PHP
PHP数组操作实例分析【添加,删除,计算,反转,排序,查找等】
2016/12/24 PHP
PHP中检查isset()和!empty()函数的必要性
2019/02/13 PHP
js获取某月的最后一天日期的简单实例
2013/06/22 Javascript
js向上无缝滚动,网站公告效果 具体代码
2013/11/18 Javascript
javascript常见用法总结
2014/05/22 Javascript
Jquery节点遍历next与nextAll方法使用示例
2014/07/22 Javascript
js返回前一页刷新本页重载页面
2014/07/29 Javascript
解决Jquery向页面append新元素之后事件的绑定问题
2015/03/16 Javascript
jQuery给元素添加样式的方法详解
2015/12/30 Javascript
非常优秀的JS图片轮播插件Swiper的用法
2017/01/03 Javascript
解决React Native端口号修改的方法
2017/07/28 Javascript
JS中精巧的自动柯里化实现方法
2017/12/12 Javascript
vue轮播图插件vue-concise-slider的使用
2018/03/13 Javascript
JS实现DOM删除节点操作示例
2018/04/04 Javascript
vue中使用heatmapjs的示例代码(结合百度地图)
2018/09/05 Javascript
vue项目引入字体.ttf的方法
2018/09/28 Javascript
Vue中的nextTick作用和几个简单的使用场景
2021/01/25 Vue.js
[01:34]传奇从这开始 2016国际邀请赛中国区预选赛震撼开启
2016/06/26 DOTA
python内存管理分析
2015/04/08 Python
简单介绍Python的Django框架加载模版的方式
2015/07/20 Python
简单了解什么是神经网络
2017/12/23 Python
对python numpy.array插入一行或一列的方法详解
2019/01/29 Python
django多对多表的创建,级联删除及手动创建第三张表
2019/07/25 Python
django+tornado实现实时查看远程日志的方法
2019/08/12 Python
Python列表list常用内建函数实例小结
2019/10/22 Python
python判断单向链表是否包括环,若包含则计算环入口的节点实例分析
2019/10/23 Python
python使用PIL剪切和拼接图片
2020/03/23 Python
python 安装impala包步骤
2020/03/28 Python
SOKOLOV官网:俄罗斯珠宝首饰品牌
2021/01/02 全球购物
初中学校对照检查材料
2014/08/19 职场文书
手术室护士个人总结
2015/02/13 职场文书
关于社会实践的心得体会(2016最新版)
2016/01/25 职场文书
Python还能这么玩之只用30行代码从excel提取个人值班表
2021/06/05 Python