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改变日志(logging)存放位置的示例
Mar 27 Python
简单介绍Python的Tornado框架中的协程异步实现原理
Apr 23 Python
python实现机械分词之逆向最大匹配算法代码示例
Dec 13 Python
python3将视频流保存为本地视频文件
Jun 20 Python
Python项目 基于Scapy实现SYN泛洪攻击的方法
Jul 23 Python
python 类的继承 实例方法.静态方法.类方法的代码解析
Aug 23 Python
Python可变对象与不可变对象原理解析
Feb 25 Python
pip install 使用国内镜像的方法示例
Apr 03 Python
scrapy爬虫:scrapy.FormRequest中formdata参数详解
Apr 30 Python
pycharm全局搜索的具体步骤
Jul 28 Python
pandas抽取行列数据的几种方法
Dec 13 Python
一行代码python实现文件共享服务器
Apr 22 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之Smarty入门
2007/01/04 PHP
php语言流程控制中的主动与被动
2012/11/05 PHP
php 获取页面中指定内容的实现类
2014/01/23 PHP
Joomla语言翻译类Jtext用法分析
2016/05/05 PHP
PHP通过加锁实现并发情况下抢码功能
2016/08/10 PHP
php实现的读取CSV文件函数示例
2017/02/07 PHP
php无限级评论嵌套实现代码
2018/04/18 PHP
js通过googleAIP翻译PHP系统的语言配置的实现代码
2011/10/17 Javascript
如何创建一个JavaScript弹出DIV窗口层的效果
2013/09/25 Javascript
js图片实时加载提供网页打开速度
2014/09/11 Javascript
jquery 实现返回顶部功能
2014/11/17 Javascript
JS+CSS实现模仿浏览器网页字符查找功能的方法
2015/02/26 Javascript
jQuery插件ImageDrawer.js实现动态绘制图片动画(附源码下载)
2016/02/25 Javascript
js+canvas实现动态吃豆人效果
2017/03/22 Javascript
解决AngualrJS页面刷新导致异常显示问题
2017/04/20 Javascript
在Vue中如何使用Cookie操作实例
2017/07/27 Javascript
详解Vue Elementui中的Tag与页面其它元素相互交互的两三事
2018/09/25 Javascript
Node4-5静态资源服务器实战以及优化压缩文件实例内容
2019/08/29 Javascript
python连接sql server乱码的解决方法
2013/01/28 Python
Python中for循环和while循环的基本使用方法
2015/08/21 Python
Python开发的实用计算器完整实例
2017/05/10 Python
PyQt5每天必学之事件与信号
2018/04/20 Python
django的聚合函数和aggregate、annotate方法使用详解
2019/07/23 Python
基于python 凸包问题的解决
2020/04/16 Python
关于h5中的fetch方法解读(小结)
2017/11/15 HTML / CSS
全球航班旅行搜索网站:Cheapflights
2017/05/19 全球购物
全球知名的珠宝首饰品牌:Kay Jewelers
2018/02/11 全球购物
澳大利亚最大的护发和护肤品购物网站:RY
2019/12/26 全球购物
2014端午节活动策划方案
2014/01/27 职场文书
《地震中的父与子》教学反思
2014/04/10 职场文书
社区志愿者活动方案
2014/08/18 职场文书
科级干部群众路线教育实践活动个人对照检查材料
2014/09/19 职场文书
幼儿园辞职书
2015/02/26 职场文书
考博导师推荐信范文
2015/03/27 职场文书
大学生军训感言
2015/08/01 职场文书
Java 通过手写分布式雪花SnowFlake生成ID方法详解
2022/04/07 Java/Android