【翻译】理解 Python 的下划线(_)
下划线 (_)
在 Python 中很特殊。
?
虽然下划线 (_)
在大多数语言中仅用于蛇形变量和函数(当然,不是全部),但它在 Python 中具有特殊含义。 如果你是 Python 程序员,对于 for _ in range(10)
、__init__(self)
之类的语法可能很熟悉。
?
这篇文章将解释何时以及如何使用下划线 (_) 并帮助你理解它。
?
在 Python 中使用下划线有5种情况。
- 用于在解释器中存储最后一个表达式的值。
- 用于忽略特定值。 (所谓的“我不在乎”)
- 为变量或函数的名称赋予特殊的含义和函数。
- 用作“国际化(i18n)”或“本地化(l10n)”功能。
- 分隔数字文字值。
让我们看看每个案例。
在解释器中使用时 python 解释器将最后一个表达式值存储到名为“_”的特殊变量中。 此特性在标准 CPython 解释器中首先使用,你也可以在其他 Python 解释器中使用它。
>>> 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()
给变量和函数的名称赋予特殊的含义 下划线可能最常用于“命名”。 作为 Python 约定指南的 PEP8 介绍了以下 4 种命名情况。
单下划线前缀(_single) 该约定用于在模块中声明私有变量、函数、方法和类。 在
from module import *
中任何带有此约定的内容将被忽略。?
但是,当然,Python 并不支持真正的私有,所以我们不能强制某些东西是私有的,也可以直接从其他模块调用它。 所以有时我们说它是“弱内部使用表示”。
_internal_name = 'one_nodule' # private variable
_internal_version = '1.0' # private variableclass _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()
单下划线后缀(single_) 此约定可用于避免与 Python 关键字或内置函数发生冲突。 你可能不经常使用它。
Tkinter.Toplevel(master, class_='ClassName') # Avoid conflict with 'class' keyword
list_ = List.objects.get(1) # Avoid conflict with 'list' built-in type
双下划线前缀(__double) 这关于语法而不是约定。 双下划线将破坏类的属性名称,以避免类之间的属性名冲突。 (所谓的“mangling”是指编译器或解释器用一些规则修改变量或函数名,而不是照原样使用)。
?
Python 的修改规则是在属性名称前面添加“_ClassName”,并用双下划线声明。
?
也就是说,如果你在一个类中编写名为“__method”的方法,该名称将被修改为“_ClassName__method”形式。
class A:
def _single_method(self):
pass
def __double_method(self): # for mangling
pass
class B(A):
def __double_method(self): # for mangling
pass
?
因为双下划线命名的属性会像上面一样被破坏,我们不能用“ClassName.__method”来访问它。 有时,有些人像真正私有那样使用这个功能,但它不是私有的,也不推荐使用。 有关更多详细信息,请阅读 Python 命名。
双下划线前后缀(__double__) 该约定用于特殊变量或方法(所谓的“魔术方法”),例如
__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)函数 它只是约定俗成,没有任何语法功能。 也就是说,下划线并不意味着 i18n/l10n,它只是一个约定,将 i18n/l10n 绑定到下划线变量。i18n/l10n的内置库
gettext
使用了这个约定,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.'))
?
分隔数字字面值 【【翻译】理解 Python 的下划线(_)】此特性是在 Python 3.6 中添加的。 它用于使用下划线分隔数字的字面值以提高可读性。
dec_base = 1_000_000
bin_base = 0b_1111_0000
hex_base = 0x_1234_abcd
print(dec_base) # 1000000
print(bin_base) # 240
print(hex_base) # 305441741
总结 到目前为止,我们已经介绍了 Python 的下划线。 虽然我是一名 Python 程序员,但在写这篇文章之前我并不了解其中的一些。 尤其是 i18n/l10n 对我来说很新。
?
像我一样,我希望你从这篇文章中获得一些关于下划线的有用知识。
?
翻译
Understanding the underscore( _ ) of Python of Python")
文章图片
推荐阅读
- 宽容谁
- 我要做大厨
- 增长黑客的海盗法则
- 画画吗()
- 2019-02-13——今天谈梦想()
- 远去的风筝
- 三十年后的广场舞大爷
- 叙述作文
- 20190302|20190302 复盘翻盘
- 学无止境,人生还很长