这篇文章讨论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 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定义的特殊方法名使用这种惯例吧。

时间: 2015-06-23

python中的下划线_Python中的下划线详解相关推荐

  1. python中的sep参数_Python sep参数使用方法详解

    Python sep参数使用方法详解 这篇文章主要介绍了Python sep参数使用方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Pyth ...

  2. python制作中文词云_Python如何生成词云(详解)

    前言 今天教大家用wrodcloud模块来生成词云,我读取了一篇小说并生成了词云,先看一下效果图: 效果图一: 效果图二: 根据效果图分析的还是比较准确的,小说中的主人公就是"程理" ...

  3. python读yaml的库_Python读取YAML文件过程详解

    这篇文章主要介绍了Python读取YAML文件过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Python读取方法: import yaml ...

  4. python模拟银行存取款_python 模拟银行转账功能过程详解

    首先画出流程图,流程图与现实代码有出入,因为刚开始画流程图的时候,有些东西没考虑进去,后来写着写着就慢慢能想起来并实现了. 另有一点经验推荐给新手朋友,如果说碰到一个项目无从下手的话,就先慢慢去写,写 ...

  5. python如何强制转换数据类型_python数据类型强制转换实例详解

    如果是字符串进行强制转换, 仅仅就是在原数据类型的两边套上引号 2.list : 强制转换成列表""" 如果是字符串,会把每一个字符都单独作为一个元素放到新的列表中 如果 ...

  6. python用列表推导式_python 列表推导式使用详解

    所谓的列表推导式,就是指的轻量级循环创建列表. 基本使用方式 # 创建一个0-10的列表 a = [x for x in range(11)] print(a) """ ...

  7. python中flush什么意思_python flush()定义及作用详解(实例分析)

    今天这篇文章我们来了解一下python之中的flush,在进入文章之前我们首先要知道我们要学的是什么东西,今天讲的是pythonflush,了解什么是flush,并且知道flash什么意思.这些东西我 ...

  8. python中bytes的用法_Python bytes类型及用法详解

    Python bytes 类型用来表示一个字节串."字节串"不是编程术语,是我自己"捏造"的一个词,用来和字符串相呼应. bytes 是 Python 3.x ...

  9. python中spider的用法_python网络爬虫 CrawlSpider使用详解

    CrawlSpider 作用:用于进行全站数据爬取 CrawlSpider就是Spider的一个子类 如何新建一个基于CrawlSpider的爬虫文件 scrapy genspider -t craw ...

  10. python爬虫框架实例项目_python爬虫框架scrapy实例详解

    生成项目 scrapy提供一个工具来生成项目,生成的项目中预置了一些文件,用户需要在这些文件中添加自己的代码. 打开命令行,执行:scrapy start tutorial/ scrapy.cfg t ...

最新文章

  1. RHEL6.4更改为CentOS6.4的yum源
  2. HTML Viewer展示不同字体
  3. wxWidgets:wxFileType类用法
  4. 每日程序C语言44-反向输出一个链表(递归)
  5. 小车故障灯亮显示大全_史上最全汽车故障灯大全,留着一定有用!
  6. Capistrano deploy flow outline
  7. 一款开源免费且快速,高效和安全的跨平台备份程序:Restic使用教程
  8. ROS中阶笔记(三):机器人仿真—ArbotiX+rviz功能仿真
  9. 本地html如何导出pdf,html表格以pdf格式导出到本地
  10. linux 清除内存和Cache方法
  11. 「备战春招/秋招」美团Java面经总结终结篇(附详解答)
  12. java web xml配置详解_Java Servlet web xml 配置详解
  13. 假如时光倒流,我要这样学编程
  14. windows系统注册dll文件
  15. 【进阶版】 机器学习之聚类算法原理详解+案例解说(14)
  16. 如何制作一个HTML网页
  17. matlab一维数组操作,Matlab创建一维数组的具体操作讲解
  18. Linux内存管理(二):页面查询过程简述
  19. 一次 WebResource.axd 异常处理经历
  20. 大锤老湿教您如何配置TP-Link路由器组建wifi上网

热门文章

  1. 2013年,我跟哥们都是大厂Java工程师!后来,他转行了!现在,他的收入是我的5倍!...
  2. 这篇实战攻略,带你轻松入门Elastic search
  3. 某程序员统计同事工作时间上厕所次数!有人一天去两次,有人一天去十次!楼主:懒人屎尿多!网友:最闲的是你!...
  4. 如何把百万级别的订单根据金额排序
  5. 万字长文的Redis五种数据结构详解(理论+实战),建议收藏。
  6. 【Java8新特性】关于Java8的Stream API,看这一篇就够了!!
  7. 手把手带你剖析 Springboot 启动原理!
  8. 爬虫网页搜索策略的选择
  9. System.Runtime.InteropServices.Marshal.GetTypeFromCLSID(System.Guid) 问题解决方法
  10. NLP汉语自然语言处理原理与实践