Python中的下划线详解

作者:junjie 时间:2021-10-24 14:17:32 

这篇文章讨论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,下划线
0
投稿

猜你喜欢

  • 利用Python生成文件md5校验值函数的方法

    2023-09-29 14:51:40
  • 20年来我得到的20条编程经验

    2010-05-26 13:44:00
  • python中reload(module)的用法示例详解

    2021-01-31 10:49:11
  • python pandas分割DataFrame中的字符串及元组的方法实现

    2022-09-10 09:30:14
  • JS 调试中常见的报错问题解决方法

    2023-07-16 07:42:13
  • Data URI小试 —— 在旺旺点灯(JS)上的应用

    2009-10-30 18:28:00
  • 2008年10佳改版网站

    2008-09-22 20:15:00
  • Python3压缩和解压缩实现代码

    2022-05-04 09:42:19
  • 对Tensorflow中权值和feature map的可视化详解

    2021-03-31 22:24:39
  • 关注前端开发流程

    2009-12-31 17:38:00
  • server.mappath方法详解

    2023-07-05 08:07:48
  • python getpass实现密文实例详解

    2021-06-25 20:29:17
  • Windows环境下Python3.6.8 importError: DLLload failed:找不到指定的模块

    2022-08-07 23:03:11
  • asp内置对象Application详解

    2007-09-19 12:08:00
  • 好习惯和坏习惯

    2009-01-20 12:51:00
  • FrontPage XP设计教程1——站点初建与管理

    2008-10-11 12:13:00
  • Python实现简单求解给定整数的质因数算法示例

    2021-05-27 09:23:08
  • Python定时任务工具之APScheduler使用方式

    2022-02-02 05:50:51
  • MySQL表设计优化与索引 (八)

    2010-10-25 19:46:00
  • Python reduce函数作用及实例解析

    2023-10-10 22:27:47
  • asp之家 网络编程 m.aspxhome.com