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检测是文件还是目录的方法
Jul 03 Python
python的pdb调试命令的命令整理及实例
Jul 12 Python
简述Python2与Python3的不同点
Jan 21 Python
django中的HTML控件及参数传递方法
Mar 20 Python
pycharm下查看python的变量类型和变量内容的方法
Jun 26 Python
解决python opencv无法显示图片的问题
Oct 28 Python
Python中作用域的深入讲解
Dec 10 Python
python3模拟实现xshell远程执行liunx命令的方法
Jul 12 Python
Python中bisect的使用方法
Dec 31 Python
TFRecord文件查看包含的所有Features代码
Feb 17 Python
keras的三种模型实现与区别说明
Jul 03 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
加速XP搜索功能堪比vista
2007/03/22 PHP
一个简单的网页密码登陆php代码
2012/07/17 PHP
jQuery UI Autocomplete 1.8.16 中文输入修正代码
2012/04/16 Javascript
jQuery 翻牌或百叶窗效果(内容三秒自动切换)
2012/06/14 Javascript
javascript之Partial Application学习
2013/01/10 Javascript
jQuery判断密码强度实现思路及代码
2013/04/24 Javascript
javascript对象的使用和属性操作示例详解
2014/03/02 Javascript
javascript中的nextSibling使用陷(da)阱(keng)
2014/05/05 Javascript
如何在MVC应用程序中使用Jquery
2014/11/17 Javascript
JavaScript实现文字与图片拖拽效果的方法
2015/02/16 Javascript
基于JavaScript实现移动端点击图片查看大图点击大图隐藏
2015/11/04 Javascript
JavaScript+Java实现HTML页面转为PDF文件保存的方法
2016/05/30 Javascript
详解Javascript中prototype属性(推荐)
2016/09/03 Javascript
vue.js+Echarts开发图表放大缩小功能实例
2017/06/09 Javascript
详解Vue Elementui中的Tag与页面其它元素相互交互的两三事
2018/09/25 Javascript
vue-cli3 项目从搭建优化到docker部署的方法
2019/01/28 Javascript
vue移动端模态框(可传参)的实现
2019/11/20 Javascript
Vue + Node.js + MongoDB图片上传组件实现图片预览和删除功能详解
2020/04/29 Javascript
[47:42]完美世界DOTA2联赛PWL S2 GXR vs Ink 第一场 11.19
2020/11/20 DOTA
Python实现利用163邮箱远程关电脑脚本
2018/02/22 Python
python使用time、datetime返回工作日列表实例代码
2019/05/09 Python
python os模块简单应用示例
2019/05/23 Python
Python 静态方法和类方法实例分析
2019/11/21 Python
python离线安装外部依赖包的实现
2020/02/13 Python
Python使用进程Process模块管理资源
2020/03/05 Python
Windows环境下Python3.6.8 importError: DLLload failed:找不到指定的模块
2020/11/01 Python
HTML5+CSS3实例 :canvas 模拟实现电子彩票刮刮乐代码
2016/12/30 HTML / CSS
奥地利网上书店:Weltbild
2017/07/14 全球购物
斯凯奇新西兰官网:SKECHERS新西兰
2018/02/22 全球购物
什么是Linux虚拟文件系统VFS
2012/01/31 面试题
人力资源专员岗位职责
2014/01/30 职场文书
投资意向书范本
2014/04/01 职场文书
化学教育专业求职信
2014/07/08 职场文书
学校做一个有道德的人活动方案
2014/08/23 职场文书
安全隐患整改报告
2014/11/06 职场文书
Python实现智慧校园自动评教全新版
2021/06/18 Python