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中的数学运算操作符使用进阶
Jun 20 Python
Python的装饰器用法学习笔记
Jun 24 Python
Python连接DB2数据库
Aug 27 Python
python实现逻辑回归的方法示例
May 02 Python
python 接口_从协议到抽象基类详解
Aug 24 Python
对Pycharm创建py文件时自定义头部模板的方法详解
Feb 12 Python
django中上传图片分页三级联动效果的实现代码
Aug 30 Python
Python爬虫实现的根据分类爬取豆瓣电影信息功能示例
Sep 15 Python
win10从零安装配置pytorch全过程图文详解
May 08 Python
Django Model中字段(field)的各种选项说明
May 19 Python
Python Tkinter实例——模拟掷骰子
Oct 24 Python
python UIAutomator2使用超详细教程
Feb 19 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木马攻击防御之道
2008/03/24 PHP
PHP运行模式的深入理解
2013/06/03 PHP
使用cookie实现统计访问者登陆次数
2013/06/08 PHP
php获取操作系统语言代码
2013/11/04 PHP
smarty简单入门实例
2014/11/28 PHP
PHP pthreads v3下worker和pool的使用方法示例
2020/02/21 PHP
获取任意Html元素与body之间的偏移距离 offsetTop、offsetLeft (For:IE5+ FF1 )[
2006/12/22 Javascript
ie8 不支持new Date(2012-11-10)问题的解决方法
2013/07/31 Javascript
Javascript学习笔记之数组的构造函数
2014/11/23 Javascript
javascript数据类型示例分享
2015/01/19 Javascript
jQuery检测输入的字符串包含的中英文的数量
2015/04/17 Javascript
JS+CSS实现自动切换的网页滑动门菜单效果代码
2015/09/14 Javascript
js判断手机号运营商的方法
2015/10/23 Javascript
JavaScript中通过提示框跳转页面的方法
2016/02/14 Javascript
vue-cli 默认路由再子路由选中下的选中状态问题及解决代码
2018/09/06 Javascript
ES5新增数组的实现方法
2020/05/12 Javascript
Python探索之静态方法和类方法的区别详解
2017/10/27 Python
基于MTCNN/TensorFlow实现人脸检测
2018/05/24 Python
Python3 shutil(高级文件操作模块)实例用法总结
2020/02/19 Python
新版Pycharm中Matplotlib不会弹出独立的显示窗口的问题
2020/06/02 Python
Python调用ffmpeg开源视频处理库,批量处理视频
2020/11/16 Python
python基于opencv 实现图像时钟
2021/01/04 Python
pytest fixtures装饰器的使用和如何控制用例的执行顺序
2021/01/28 Python
Html5画布_动力节点Java学院整理
2017/07/13 HTML / CSS
欧洲最大的拼图游戏商店:JigsawPuzzle.co.uk
2018/07/04 全球购物
英国现代家具和照明购物网站:Heal’s
2019/10/30 全球购物
DTD的含义以及作用
2014/01/26 面试题
自荐信的格式
2014/03/10 职场文书
班级标语大全
2014/06/21 职场文书
移交协议书
2014/08/19 职场文书
学校个人对照检查材料
2014/08/26 职场文书
德能勤绩廉个人总结
2015/02/14 职场文书
全国劳模先进事迹材料(2016精选版)
2016/02/25 职场文书
你有一份《诚信考试承诺书》待领取
2019/11/13 职场文书
laravel ajax curd 搜索登录判断功能的实现
2021/04/17 PHP
Promise面试题详解之控制并发
2021/05/14 面试题