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解析html开发库pyquery使用方法
Feb 07 Python
Python xlrd读取excel日期类型的2种方法
Apr 28 Python
python 中的divmod数字处理函数浅析
Oct 17 Python
python机器学习之决策树分类详解
Dec 20 Python
对python创建及引用动态变量名的示例讲解
Nov 10 Python
Python3多目标赋值及共享引用注意事项
May 27 Python
Python 多线程,threading模块,创建子线程的两种方式示例
Sep 29 Python
使用Python打造一款间谍程序的流程分析
Feb 21 Python
基于Python脚本实现邮件报警功能
May 20 Python
Python使用matplotlib绘制圆形代码实例
May 27 Python
pycharm 实现复制一行的快捷键
Jan 15 Python
基于Python的接口自动化读写excel文件的方法
Jan 15 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下删除一篇文章生成的多个静态页面
2010/08/08 PHP
解析如何用php screw加密php源代码
2013/06/20 PHP
php防止恶意刷新与刷票的方法
2014/11/21 PHP
php用xpath解析html的代码实例讲解
2019/02/14 PHP
PHP连接MySQL数据库操作代码实例解析
2020/07/11 PHP
Yii-自定义删除确认弹框(zyd)jquery实现代码
2013/03/04 Javascript
jquery 实现二级/三级/多级联动菜单的思路及代码
2013/04/08 Javascript
js操作iframe兼容各种主流浏览器示例代码
2013/07/22 Javascript
深入分析原生JavaScript事件
2014/12/29 Javascript
JS实现的自定义右键菜单实例二则
2015/09/01 Javascript
基于Bootstrap的Java开发问题汇总(Spring MVC)
2017/01/15 Javascript
使用JS判断移动端手机横竖屏状态
2018/07/30 Javascript
JS/HTML5游戏常用算法之碰撞检测 包围盒检测算法详解【矩形情况】
2018/12/13 Javascript
如何从零开始手写Koa2框架
2019/03/22 Javascript
Vue Echarts实现可视化世界地图代码实例
2019/05/07 Javascript
微信小程序页面传多个参数跳转页面的实现方法
2019/05/17 Javascript
使用Vue Composition API写出清晰、可扩展的表单实现
2020/06/10 Javascript
Vue $emit()不能触发父组件方法的原因及解决
2020/07/28 Javascript
Vue自定义表单内容检查rules实例
2020/10/30 Javascript
[32:36]完美世界DOTA2联赛PWL S3 LBZS vs CPG 第二场 12.12
2020/12/16 DOTA
详解python异步编程之asyncio(百万并发)
2018/07/07 Python
python TKinter获取文本框内容的方法
2018/10/11 Python
python使用多线程+socket实现端口扫描
2020/05/28 Python
Python astype(np.float)函数使用方法解析
2020/06/08 Python
利用纯CSS3实现动态的自行车特效源码
2017/01/20 HTML / CSS
澳大利亚天然护肤品、化妆品和健康产品一站式商店:Nourished Life
2018/12/02 全球购物
公益广告语集锦
2014/03/13 职场文书
感恩寄语大全
2014/04/11 职场文书
应届硕士毕业生自荐信
2014/05/26 职场文书
音乐节策划方案
2014/06/09 职场文书
汽车技术服务与贸易专业求职信
2014/07/20 职场文书
银行奉献演讲稿
2014/09/16 职场文书
有关浪费资源的建议书
2015/09/14 职场文书
2016年优秀党务工作者先进事迹材料
2016/02/29 职场文书
《我在为谁工作》:工作的质量往往决定生活的质量
2019/12/27 职场文书
Python pandas读取CSV文件的注意事项(适合新手)
2021/06/20 Python