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调用机器喇叭发出蜂鸣声(Beep)的方法
Mar 23 Python
简单的编程0基础下Python入门指引
Apr 01 Python
Python的Socket编程过程中实现UDP端口复用的实例分享
Mar 19 Python
Python 基础教程之包和类的用法
Feb 23 Python
Python+Wordpress制作小说站
Apr 14 Python
python实现聊天小程序
Mar 13 Python
PyQt5每天必学之带有标签的复选框
Apr 19 Python
Python3.5文件修改操作实例分析
May 01 Python
Python使用百度翻译开发平台实现英文翻译为中文功能示例
Aug 08 Python
python 项目目录结构设置
Feb 14 Python
matplotlib 生成的图像中无法显示中文字符的解决方法
Jun 10 Python
Python关于OS文件目录处理的实例分享
May 23 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实现图片上传并进行替换操作
2016/03/15 PHP
PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)
2016/12/14 PHP
封装html的select标签的js操作实例
2013/07/02 Javascript
jQuery中使用each处理json数据
2015/04/23 Javascript
浅析Node.js中使用依赖注入的相关问题及解决方法
2015/06/24 Javascript
jquery制作图片时钟特效
2020/03/30 Javascript
AngularJS实用开发技巧(推荐)
2016/07/13 Javascript
AngularJS 2.0入门权威指南
2016/10/08 Javascript
Mongoose经常返回e11000 error的原因分析
2017/03/29 Javascript
nodejs 图解express+supervisor+ejs的用法(推荐)
2017/09/08 NodeJs
详解jquery插件jquery.viewport.js学习使用方法
2017/09/08 jQuery
jQuery实现的简单前端搜索功能示例
2017/10/28 jQuery
微信小程序倒计时功能实现代码
2017/11/09 Javascript
vue+axios+mock.js环境搭建的方法步骤
2018/08/28 Javascript
微信小程序使用map组件实现解析经纬度功能示例
2019/01/22 Javascript
node将geojson转shp返回给前端的实现方法
2019/05/29 Javascript
vue中后端做Excel导出功能返回数据流前端的处理操作
2020/09/08 Javascript
JavaScript代码简化技巧实例解析
2020/09/09 Javascript
JS实现简易日历效果
2021/01/25 Javascript
Python随机读取文件实现实例
2017/05/25 Python
python ddt实现数据驱动
2018/03/14 Python
在Python运行时动态查看进程内部信息的方法
2019/02/22 Python
使用Windows批处理和WMI设置Python的环境变量方法
2019/08/14 Python
python 计算积分图和haar特征的实例代码
2019/11/20 Python
详解CSS3中强大的filter(滤镜)属性
2017/06/29 HTML / CSS
通过HTML5 Canvas API绘制弧线和圆形的教程
2016/03/14 HTML / CSS
德国高性价比网上药店:medpex
2017/07/09 全球购物
世界上最好的野生海鲜和有机食品:Vital Choice
2020/01/16 全球购物
化验室技术员岗位职责
2013/12/24 职场文书
大学军训感言1500字
2014/03/09 职场文书
学习雷锋演讲稿
2014/05/10 职场文书
结对共建协议书
2014/08/20 职场文书
少先队活动总结
2014/08/29 职场文书
大学军训决心书
2015/02/05 职场文书
《假如》教学反思
2016/02/17 职场文书
2016年“5.12”国际护士节活动总结
2016/04/06 职场文书