初学Python语言者必须理解的下划线
2020-03-25
作者:mingrammer
翻译:老齐
与本文相关的图书推荐:《跟老齐学Python:轻松入门》
下划线(_
)在Python语言中有特殊作用。
在大多数编程语言中,下划线是命名变量或者函数名称时的连字符,但是,在Python语言中,不仅如此。如果你是一名Python程序员,对于诸如 _ in range(10)
, __init__(self)
之类的下发肯定熟知。
本文将详述下划线(_
)的使用方法,帮助初学者理解它。
在Python语言中,下划线主要应用在如下5个方面:
- 在交互模式中,保存最近一个表达式的值
- 忽略某个值(“我不重要”)
- 给变量或者函数名称赋予特殊含义
- 作为国际化或本地化的函数命名
- 在数字组成的值中作为分隔符
下面逐一阐述。
用在交互模式中
在Python交互模式总,如果调用_
,会显示最近的表达式的值。这个功能在标准的交互模式中都有,你也可以在其它Python交互式解析器中使用。
1 | >>> 10 |
表示忽略某个值
下划线也可以用于表示要忽略某个值。如果你不需要某个值或者该值没什么用,可以用下划线作为相应的变量。
1 | # Ignore a value when unpacking |
给变量或者函数名称赋予特殊含义
下划线,最多的用途还是在命名中,PEP8是Python开发的公约,它约定了4中命名方式。
单下划线开始
以单下划线开始的变量、函数、方法、类名称,意在声明该对象私有化,按照此预订,使用from module import *
则无法将相应对象导入。
然而,Python并不支持真正的私有化,所以我们不能强制某对象私有化,从其他模块中也能直接调用它,有时候,我们会说这种私有化的对象是“内部使用的弱指示器”。
1 | _internal_name = 'one_nodule' # private variable |
单下划线结尾
为了避免与Python关键词和其他内置对象名称冲突,常常用这种命名方式,你可以不用它。
1 | Tkinter.Toplevel(master, class_='ClassName') # Avoid conflict with 'class' keyword |
双下划线开始
这个超越一般约定的语法。当程序运行的时候,Python解析器会对以双下划开始的类中的属性、方法名称重命名,从而避免不同的类中同样名称之间的冲突,基本规则是在双下划线开始的名称前面增加形如“_ClassName”样式的前缀。
例如在类中有名为__method
的方法,这个名字会被更名为_ClassName__method
形式。
1 | class A: |
如上面所述,以双下划线为开始命名的属性和方法,我们不能用ClassName.__method
方式调用,因此,有人把这作为真正的私有化,但是,这里不推荐这种私有化方式,依据就是Python的命名规则。
译者注: 此处作者的观点,仅供参考。_namne
这种方式私有化,是约定的私有化,不是真正的私有化;__name
这种方式真正实现了“私有化”,但在编程中是否采用,有不同的观点。或者说对于“私有化”,在Python中是有不同理解的。
双下划线开始和结尾
这种约定用于特殊的变量或者方法——称为“魔法方法”(译者想:“magic method”,是不是翻译成“魔幻方法”更好呢?这些特殊方法本来就让学习者感到很“魔幻”。),比如__init__
, __len__
。这些方法提供了一些特殊的功能,比如__file__
声明本地的Python文件,__eq__
实现了表达式a == b
。
一般的开发者,很少定义这些方法,但是,在定义类的时候__init__
常常在实例化是被执行。
1 | class A: |
作为国际化或本地化函数命名
这仅仅是一个约定,不是函数中的语法。因此,下划线并不意味着国际化(i18n)或本地化(l10n),仅仅是因为这种习惯来自C语言中的习惯。
内置标准库的模块gettext,可以用于演示i18n/l10n。Python中的web开发框架Django也支持i18n/l10n,并应用此约定。
1 | # see official docs : https://docs.python.org/3/library/gettext.html |
数字之间的分隔符
这个功能是在Python3.6中加入的,用下划线作为数字的分隔符。
1 | dec_base = 1_000_000 |
结论
本文总结了Python中下换线的使用方法,有的方法或许对你是比较新鲜的,比如i18n/l10n,此前我就不知道。希望本文能对你有启发。
原文链接:https://medium.com/hackernoon/understanding-the-underscore-of-python-309d1a029edc
搜索技术问答的公众号:老齐教室
在公众号中回复:老齐,可查看所有文章、书籍、课程。
若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏
关注微信公众号,读文章、听课程,提升技能