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设计模式中的代理模式与模板方法模式编程
Feb 02 Python
Python for Informatics 第11章之正则表达式(四)
Apr 21 Python
python实现微信发送邮件关闭电脑功能
Feb 22 Python
python opencv检测目标颜色的实例讲解
Apr 02 Python
Python enumerate函数功能与用法示例
Mar 01 Python
Python range与enumerate函数区别解析
Feb 28 Python
Python flask路由间传递变量实例详解
Jun 03 Python
Python3爬虫中关于Ajax分析方法的总结
Jul 10 Python
Python使用海龟绘图实现贪吃蛇游戏
Jun 18 Python
Python实战之大鱼吃小鱼游戏的实现
Apr 01 Python
请求模块urllib之PYTHON爬虫的基本使用
Apr 08 Python
python数字图像处理:图像的绘制
Jun 28 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 header()函数语法及使用代码
2013/11/04 PHP
PHP扩展Memcache分布式部署方案
2015/12/06 PHP
php并发加锁示例
2016/10/17 PHP
thinkPHP数据查询常用方法总结【select,find,getField,query】
2017/03/15 PHP
php设计模式之观察者模式定义与用法经典示例
2019/09/19 PHP
网页中实现浏览器的最大,最小化和关闭按钮
2007/03/12 Javascript
用jQuery简化JavaScript开发分析
2009/02/19 Javascript
JQuery 小练习(实例代码)
2009/08/07 Javascript
js实现匹配时换色的输入提示特效代码
2015/08/17 Javascript
JS获取月份最后天数、最大天数与某日周数的方法
2015/12/08 Javascript
AngularJS 入门教程之HTML DOM实例详解
2016/07/28 Javascript
基于Vue、Vuex、Vue-router实现的购物商城(原生切换动画)效果
2018/01/09 Javascript
Node.js创建一个Express服务的方法详解
2020/01/06 Javascript
python解析模块(ConfigParser)使用方法
2013/12/10 Python
Python实现删除文件但保留指定文件
2015/06/21 Python
pycharm中连接mysql数据库的步骤详解
2017/05/02 Python
Python 实现淘宝秒杀的示例代码
2018/01/02 Python
PyTorch搭建一维线性回归模型(二)
2019/05/22 Python
简单介绍python封装的基本知识
2019/08/10 Python
python3 常见解密加密算法实例分析【base64、MD5等】
2019/12/19 Python
python去除删除数据中\u0000\u0001等unicode字符串的代码
2020/03/06 Python
pycharm软件实现设置自动保存操作
2020/06/08 Python
Python创建文件夹与文件的快捷方法
2020/12/08 Python
Android本地应用打开方法——通过html5写连接
2016/03/11 HTML / CSS
奥地利智能家居和智能生活网上商店:tink.at
2019/10/07 全球购物
英国Radley包德国官网:Radley London德国
2019/11/18 全球购物
精选干货:Java精选笔试题附答案
2014/01/18 面试题
通信工程专业个人找工作求职信范文
2013/09/21 职场文书
学校消防安全制度
2014/01/30 职场文书
《从现在开始》教学反思
2014/04/15 职场文书
2014年客房服务员工作总结
2014/11/18 职场文书
财务出纳岗位职责
2015/03/31 职场文书
民间借贷纠纷案件代理词
2015/05/26 职场文书
学校远程教育工作总结
2015/08/11 职场文书
2019企业文化管理制度范本!
2019/08/06 职场文书
导游词之新疆尼雅遗址
2019/10/16 职场文书