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 paramiko实现ssh远程访问的方法
Dec 03 Python
Python中if __name__ == '__main__'作用解析
Jun 29 Python
python通过文件头判断文件类型
Oct 30 Python
python2 与 pyhton3的输入语句写法小结
Sep 10 Python
Django中数据库的数据关系:一对一,一对多,多对多
Oct 21 Python
浅析PyTorch中nn.Linear的使用
Aug 18 Python
使用python 对验证码图片进行降噪处理
Dec 18 Python
python 非线性规划方式(scipy.optimize.minimize)
Feb 11 Python
Python 实现 T00ls 自动签到脚本代码(邮件+钉钉通知)
Jul 06 Python
python接口自动化框架实战
Dec 23 Python
Opencv中cv2.floodFill算法的使用
Jun 18 Python
Python pyecharts绘制条形图详解
Apr 02 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程序员的13个好习惯小结
2012/02/20 PHP
PHP中ob_start函数的使用说明
2013/11/11 PHP
PHP header()函数常用方法总结
2014/04/11 PHP
php中常量DIRECTORY_SEPARATOR用法深入分析
2014/11/14 PHP
Apache启动报错No space left on device: AH00023该怎么解决
2015/10/16 PHP
windows环境下使用Composer安装ThinkPHP5
2018/05/18 PHP
在 PHP 和 Laravel 中使用 Traits的方法
2019/11/13 PHP
PHP中echo与print区别点整理
2021/03/09 PHP
Javascript客户端将指定区域导出到Word、Excel的代码
2008/10/22 Javascript
浅谈angularJS 作用域
2015/07/05 Javascript
Highcharts学习之数据列
2016/08/03 Javascript
jQuery UI插件实现百度提词器效果
2016/11/21 Javascript
js中自定义react数据验证组件实例详解
2018/10/19 Javascript
JS实现的tab页切换效果完整示例
2018/12/18 Javascript
浅谈Fetch 数据交互方式
2018/12/20 Javascript
Vue element-ui父组件控制子组件的表单校验操作
2020/07/17 Javascript
详解在Python和IPython中使用Docker
2015/04/28 Python
python3读取csv和xlsx文件的实例
2018/06/22 Python
Python Socket编程之多线程聊天室
2018/07/28 Python
Django添加favicon.ico图标的示例代码
2018/08/07 Python
Python BeautifulSoup [解决方法] TypeError: list indices must be integers or slices, not str
2019/08/07 Python
open_basedir restriction in effect. 原因与解决方法
2021/03/14 PHP
自我评价200字分享
2013/12/17 职场文书
餐饮管理自我介绍信
2014/01/15 职场文书
班风学风建设方案
2014/05/06 职场文书
副主任竞聘演讲稿
2014/08/18 职场文书
我们的节日国庆活动方案
2014/08/19 职场文书
2014高中生入党思想汇报范文
2014/09/13 职场文书
迟到检讨书2000字(精选篇)
2014/10/07 职场文书
2015年学校团委工作总结
2015/05/26 职场文书
《飘》英文读后感五篇
2019/10/11 职场文书
读《皮囊》有感:理解是对他人的最大的善举
2019/11/14 职场文书
nginx处理http请求实现过程解析
2021/03/31 Servers
Python进阶学习之带你探寻Python类的鼻祖-元类
2021/05/08 Python
利用Pycharm连接服务器的全过程记录
2021/07/01 Python
一篇文章带你深入了解Mysql触发器
2021/08/02 MySQL