做者:mingrammerhtml
翻译:老齐python
与本文相关的图书推荐:《跟老齐学Python:轻松入门》程序员
下划线(_
)在Python语言中有特殊做用。web
在大多数编程语言中,下划线是命名变量或者函数名称时的连字符,可是,在Python语言中,不只如此。若是你是一名Python程序员,对于诸如 _ in range(10)
, __init__(self)
之类的下发确定熟知。编程
本文将详述下划线(_
)的使用方法,帮助初学者理解它。bash
在Python语言中,下划线主要应用在以下5个方面:app
下面逐一阐述。框架
在Python交互模式总,若是调用_
,会显示最近的表达式的值。这个功能在标准的交互模式中都有,你也能够在其它Python交互式解析器中使用。dom
>>> 10
10
>>> _
10
>>> _ * 3
30
>>> _ * 20
600
复制代码
下划线也能够用于表示要忽略某个值。若是你不须要某个值或者该值没什么用,能够用下划线做为相应的变量。编程语言
# Ignore a value when unpacking
x, _, y = (1, 2, 3)
# x = 1, y = 3
# Ignore the multiple values. It is called "Extended Unpacking" which is available in only Python 3.x
x, *_, y = (1, 2, 3, 4, 5)
# x = 1, y = 5
# Ignore the index
for _ in range(10):
do_something()
# Ignore a value of specific location
for _, val in list_of_tuple:
do_something()
复制代码
下划线,最多的用途仍是在命名中,PEP8是Python开发的公约,它约定了4中命名方式。
以单下划线开始的变量、函数、方法、类名称,意在声明该对象私有化,按照此预订,使用from module import *
则没法将相应对象导入。
然而,Python并不支持真正的私有化,因此咱们不能强制某对象私有化,从其余模块中也能直接调用它,有时候,咱们会说这种私有化的对象是“内部使用的弱指示器”。
_internal_name = 'one_nodule' # private variable
_internal_version = '1.0' # private variable
class _Base: # private class
_hidden_factor = 2 # private variable
def __init__(self, price):
self._price = price
def _double_price(self): # private method
return self._price * self._hidden_factor
def get_double_price(self):
return self._double_price()
复制代码
为了不与Python关键词和其余内置对象名称冲突,经常用这种命名方式,你能够不用它。
Tkinter.Toplevel(master, class_='ClassName') # Avoid conflict with 'class' keyword
list_ = List.objects.get(1) # Avoid conflict with 'list' built-in type
复制代码
这个超越通常约定的语法。当程序运行的时候,Python解析器会对以双下划开始的类中的属性、方法名称重命名,从而避免不一样的类中一样名称之间的冲突,基本规则是在双下划线开始的名称前面增长形如“_ClassName”样式的前缀。
例如在类中有名为__method
的方法,这个名字会被改名为_ClassName__method
形式。
class A:
def _single_method(self):
pass
def __double_method(self): # for mangling
passclass B(A):
def __double_method(self): # for mangling
pass
复制代码
如上面所述,以双下划线为开始命名的属性和方法,咱们不能用ClassName.__method
方式调用,所以,有人把这做为真正的私有化,可是,这里不推荐这种私有化方式,依据就是Python的命名规则。
译者注: 此处做者的观点,仅供参考。_namne
这种方式私有化,是约定的私有化,不是真正的私有化;__name
这种方式真正实现了“私有化”,但在编程中是否采用,有不一样的观点。或者说对于“私有化”,在Python中是有不一样理解的。
这种约定用于特殊的变量或者方法——称为“魔法方法”(译者想:“magic method”,是否是翻译成“魔幻方法”更好呢?这些特殊方法原本就让学习者感到很“魔幻”。),好比__init__
, __len__
。这些方法提供了一些特殊的功能,好比__file__
声明本地的Python文件,__eq__
实现了表达式a == b
。
通常的开发者,不多定义这些方法,可是,在定义类的时候__init__
经常在实例化是被执行。
class A:
def __init__(self, a): # use special method '__init__' for initializing
self.a = a
def __custom__(self): # custom special method. you might almost do not use it
pass
复制代码
这仅仅是一个约定,不是函数中的语法。所以,下划线并不意味着国际化(i18n)或本地化(l10n),仅仅是由于这种习惯来自C语言中的习惯。
内置标准库的模块gettext,能够用于演示i18n/l10n。Python中的web开发框架Django也支持i18n/l10n,并应用此约定。
# see official docs : https://docs.python.org/3/library/gettext.html
import gettext
gettext.bindtextdomain('myapplication','/path/to/my/language/directory')
gettext.textdomain('myapplication')
_ = gettext.gettext
# ...
print(_('This is a translatable string.'))
复制代码
这个功能是在Python3.6中加入的,用下划线做为数字的分隔符。
dec_base = 1_000_000
bin_base = 0b_1111_0000
hex_base = 0x_1234_abcdprint(dec_base) # 1000000
print(bin_base) # 240
print(hex_base) # 305441741
复制代码
本文总结了Python中下换线的使用方法,有的方法或许对你是比较新鲜的,好比i18n/l10n,此前我就不知道。但愿本文能对你有启发。
搜索技术问答的公众号:老齐教室
在公众号中回复:老齐,可查看全部文章、书籍、课程。