社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

【译】初学Python语言者必须理解的下划线

老齐Py • 5 年前 • 462 次点击  
阅读 18

【译】初学Python语言者必须理解的下划线

作者:mingrammer

翻译:老齐

与本文相关的图书推荐:《跟老齐学Python:轻松入门》

本书各大电商平台有售


下划线(_)在Python语言中有特殊作用。

在大多数编程语言中,下划线是命名变量或者函数名称时的连字符,但是,在Python语言中,不仅如此。如果你是一名Python程序员,对于诸如 _ in range(10) , __init__(self) 之类的下发肯定熟知。

本文将详述下划线(_)的使用方法,帮助初学者理解它。

在Python语言中,下划线主要应用在如下5个方面:

  • 在交互模式中,保存最近一个表达式的值
  • 忽略某个值(“我不重要”)
  • 给变量或者函数名称赋予特殊含义
  • 作为国际化或本地化的函数命名
  • 在数字组成的值中作为分隔符

下面逐一阐述。

用在交互模式中

在Python交互模式总,如果调用_,会显示最近的表达式的值。这个功能在标准的交互模式中都有,你也可以在其它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()
复制代码

给变量或者函数名称赋予特殊含义

下划线,最多的用途还是在命名中,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,此前我就不知道。希望本文能对你有启发。

原文链接:medium.com/hackernoon/…

搜索技术问答的公众号:老齐教室

在公众号中回复:老齐,可查看所有文章、书籍、课程。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/56760
 
462 次点击