当前位置: 首页 > 后端技术 > Python

【译文】理解Python的下划线(_)

时间:2023-03-26 16:33:37 Python

下划线(_)在Python中比较特殊。虽然下划线(_)在大多数语言(当然不是全部)中只用于snake变量和函数中,但它在Python中有着特殊的含义。如果您是Python程序员,可能会熟悉for_inrange(10)、__init__(self)等语法。本文将解释何时以及如何使用下划线(_)并帮助您理解它。Python中有5种使用下划线的情况。用于存储解释器中最后一个表达式的值。用于忽略特定值。(所谓“我不在乎”)给变量或函数、函数的名字赋予特殊的意义。用作“国际化(i18n)”或“本地化(l10n)”功能。分隔数字文字值。让我们看看每个案例。当在解释器中使用时,python解释器将最后一个表达式值存储到一个名为“_”的特殊变量中。此功能首先用于标准CPython解释器,但您也可以在其他Python解释器中使用它。>>>1010>>>_10>>>_*330>>>_*20600忽略值下划线也用于忽略特定值。如果不需要或不使用特定值,只需将该值分配给下划线即可。#解包时忽略一个值x,_,y=(1,2,3)#x=1,y=3#忽略多个值。它被称为“扩展解包”,仅在Python3.xx中可用,*_,y=(1,2,3,4,5)#x=1,y=5#Ignoretheindexfor_inrange(10):do_something()#Ignoreavalueofspecificlocationfor_,valinlist_of_tuple:do_something()赋予变量和函数名称特殊意义下划线可能最常用于“命名”。PEP8是Python的约定指南,介绍了以下4种命名情况。单下划线前缀(_single)该约定用于在模块中声明私有变量、函数、方法和类。frommoduleimport*中具有此约定的任何内容都将被忽略。但是,当然,Python不支持真正的私有化,所以我们不能强制某些东西是私有的并直接从其他模块调用它。所以有时我们说它是“弱内部使用表示”。_internal_name='one_nodule'#privatevariable_internal_version='1.0'#privatevariableclass_Base:#privateclass_hidden_??factor=2#privatevariabledef__init__(self,price):self._price=pricedef_double_priceod(self):#privateself._price*self._hidden_??factordefget_double_price(self):returnself._double_price()单下划线后缀(single_)这个约定可以用来避免与Python关键字或内置函数的冲突。你可能不经常使用它。Tkinter.Toplevel(master,class_='ClassName')#避免与'class'关键字冲突list_=List.objects.get(1)#避免与'list'内置类型冲突双下划线前缀(__double)这是关于语法不是协议。双下划线会破坏类的属性名称以避免类之间的属性名称冲突。(所谓“mangling”是指编译器或解释器以某种规则修改变量或函数名,而不是按原样使用)。Python的修改规则是在属性名前加“_ClassName”,并用双下划线声明。也就是说,如果你在一个类中写了一个名为“__method”的方法,这个名字会被修改为“_ClassName__method”的形式。classA:def_single_method(self):passdef__double_method(self):#formanglingpassclassB(A):def__double_method(self):#formanglingpass因为用双下划线命名的属性会像上面那样被破坏,我们无法使用“ClassName.__method”访问它。有时,有些人使用这个功能就像它真的是私有的,但它不是私有的,不推荐使用。有关详细信息,请阅读Python命名。双下划线前缀和后缀(__double__)此约定用于特殊变量或方法(所谓的“魔术方法”),例如__init__、__len__。这些方法提供特殊的句法特征或做特殊的事情。例如,__file__表示一个Python文件的位置,__eq__是在执行a==b表达式时执行的。用户当然可以自定义特殊的方法,这种情况很少见,但往往可以修改一些内置的特殊方法。(例如,你应该使用__init__来初始化类,它会在创建类的实例时首先执行。)classA:def__init__(self,a):#使用特殊方法'__init__'来初始化self。a=adef__custom__(self):#自定义特殊方法。你可能几乎不使用它作为国际化(i18n)/本地化(l10n)功能传递它只是一个约定,没有任何语法功能。也就是说,下划线并不意味着i18n/l10n,它只是将i18n/l10n绑定到下划线变量的约定。i18n/l10n的内置库gettext就使用了这个约定,Pythonweb框架Django也支持i18n/l10n,引入并使用了这个约定。#查看官方文档:https://docs.python.org/3/library/gettext.htmlimportgettextgettext.bindtextdomain('myapplication','/path/to/my/language/directory')gettext.textdomain('myapplication')_=gettext.gettext#...print(_('Thisisatranslatablestring.'))Delimitednumericliterals此功能是在Python3.6中添加的。它用于用下划线分隔数字的字面值以提高可读性。dec_base=1_000_000bin_base=0b_1111_0000hex_base=0x_1234_abcdprint(dec_base)#1000000print(bin_base)#240print(hex_base)#305441741总结至此,我们介绍完了Python的下划线。虽然我是一名Python程序员,但在写这篇文章之前我并不了解其中的一些。特别是i18n/l10n对我来说很陌生。像我一样,我希望您从本文中获得一些关于下划线的有用知识。翻译Understandingtheunderscore(_)ofPythonofPython")