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的Django框架中调用方法和处理无效变量
Jul 15 Python
Python中shutil模块的常用文件操作函数用法示例
Jul 05 Python
Python基于回溯法子集树模板解决全排列问题示例
Sep 07 Python
python 读取.csv文件数据到数组(矩阵)的实例讲解
Jun 14 Python
python之文件读取一行一行的方法
Jul 12 Python
使用python将图片格式转换为ico格式的示例
Oct 22 Python
python中数组和矩阵乘法及使用总结(推荐)
May 18 Python
详解python解压压缩包的五种方法
Jul 05 Python
python tkinter基本属性详解
Sep 16 Python
python标准库OS模块详解
Mar 10 Python
Pyinstaller 打包发布经验总结
Jun 02 Python
基于python实现银行管理系统
Apr 20 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 中的类
2006/10/09 PHP
PHP新手入门学习方法
2011/05/08 PHP
PHP函数篇之掌握ord()与chr()函数应用
2011/12/05 PHP
解析php中eclipse 用空格替换 tab键
2013/06/24 PHP
PHP PDOStatement对象bindpram()、bindvalue()和bindcolumn之间的区别
2014/11/20 PHP
php操作xml入门之cdata区段
2015/01/23 PHP
[原创]php实现 data url的图片生成与保存
2016/12/04 PHP
php微信开发之关注事件
2018/06/14 PHP
表单提交时自动复制内容到剪贴板的js代码
2007/03/16 Javascript
Javascript 面向对象(二)封装代码
2012/05/23 Javascript
js获取php变量的实现代码
2013/08/10 Javascript
JS 日期比较大小的简单实例
2014/01/13 Javascript
JavaScript使用setInterval()函数实现简单轮询操作的方法
2015/02/02 Javascript
jQuery实现的感应鼠标悬停图片色彩渐显效果
2015/03/03 Javascript
js实现的牛顿摆效果
2015/03/31 Javascript
JS+Canvas绘制时钟效果
2020/08/20 Javascript
JS实现基于Sketch.js模拟成群游动的蝌蚪运动动画效果【附demo源码下载】
2017/08/18 Javascript
Vue 页面切换效果之 BubbleTransition(推荐)
2018/04/08 Javascript
vue中的面包屑导航组件实例代码
2019/07/01 Javascript
vue 自定指令生成uuid滚动监听达到tab表格吸顶效果的代码
2020/09/16 Javascript
python实现斐波那契递归函数的方法
2014/09/08 Python
Python多进程multiprocessing用法实例分析
2017/08/18 Python
Python Selenium异常处理的实例分析
2021/02/28 Python
shell变量的作用空间是什么
2013/08/17 面试题
自我评价优秀范文分享
2013/11/30 职场文书
售前工程师职业生涯规划
2014/03/02 职场文书
《莫泊桑拜师》教学反思
2014/04/23 职场文书
党员个人自我剖析材料
2014/10/08 职场文书
2015年社区服务活动总结
2015/03/25 职场文书
工厂门卫岗位职责
2015/04/13 职场文书
运动会开幕式主持词
2015/07/01 职场文书
小学运动会入场词
2015/07/18 职场文书
2019年作为一名实习生的述职报告
2019/09/29 职场文书
创业计划书之外语培训班
2019/11/02 职场文书
python爬取网页版QQ空间,生成各类图表
2021/06/02 Python
pycharm安装深度学习pytorch的d2l包失败问题解决
2022/03/25 Python