Python 的 Ellipsis 对象(转)

原文链接地址 https://farer.org/2017/11/29/python-ellipsis-object/

<

Ellipsis对象。

在Python 3中你可以直接写...来得到这玩意。

>>> ...Ellipsis>>> type(...)<class 'ellipsis'>>>>

而在2中没有...这个语法,只能直接写Ellipsis来获取。

>>> EllipsisEllipsis>>> type(Ellipsis)<type 'ellipsis'>>>>

它转为布尔值时为真

>>> bool(...)True

最后,这东西是一个单例。

>>> id(...)4362672336>>> id(...)4362672336

用法

那么这东西有啥用呢?实际上没什么用。它自身并没有什么特殊的方法或属性,只是一个普通的对象而已。而官方文档上说Ellipsis通常用来扩展切片的功能,但说得很模糊,也没见有多少人在用这个东西。

1. 辣鸡语法糖

切片(Slicings)用来选取一个序列的某个范围并返回,这个过程归根结底是一次函数调用。如lst[1:3]这样的切片操作会把slice(1,3,None)作为参数,传入__getitem__(self, key)这个方法中,另外字典类型取值时a[k]实际上也是使用了这个__getitem__(self, key)方法。

那么可以通过魔改这个东西来强行实现递推序列之类的玩意了。

class Mogic(object):    def __getitem__(self, key):        if len(key) == 3 and key[2] is Ellipsis:            d = key[1] - key[0]            r = key[0]            while True:                yield r                r += d
ap = Mogic()    # arithmetic progression
import time 
for i in ap[1,3,...]:    print(i)         # caution: infinity loop here    time.sleep(1)    # slow down output

然后我们发现,这个东西,其实,不用它也能实现= =

2. 别人家的语法糖

著名的数学计算库 NumPy 中是这样玩的,比如在迭代中修改n维数组中的值。

>>> a = np.arange(6).reshape(2,3)>>> aarray([[0, 1, 2],       [3, 4, 5]])>>> for x in np.nditer(a, op_flags=['readwrite']):...     x[...] = 2 * x...>>> aarray([[ 0,  2,  4],       [ 6,  8, 10]])

当然NumPy中对Ellipsis还有很多其他的玩法,令人叹为观止,比我们的辣鸡实现不知道高到哪里去了。这些功能其实也是通过在__getitem__中做相应的判断而实现的。

3. 在Type Hints中使用

在Python 3.5中,PEP 484 -- Type Hints 特性被加了进来(虽然没见什么人用过)。在写python hints的时候也可以使用Ellipsis。

在类型提示中使用Callable,不确定参数签名时,可以用Ellipsis占位。

from typing import Callable
def foo() -> Callable[..., int]:    return lambda x: 1

使用Tuple时返回不定长的tuple,用Ellipsis进行指定。

from typing import  Tuple
def bar() -> Tuple[int, ...]:    return (1,2,3)    def buzz() -> Tuple[int, ...]:    return (1,2,3,4)

或者是在以.pyi结尾的文件即stub files中,声明一个变量并标记它的类型,而且不想给它初始值时使用。

from typing import IO
stream = ...  # type: IO[str]

4. 对同事宝具

当你写程序写得无聊了,面对某个异常觉得十分无语,又不想普普通通的写个pass,可以洒下一排...表达自己忧伤又无奈的心情。

try:    1/0except ZeroDivisionError:    ...

某天你听到旁边座位的小哥发出了一声WTF,然后抄着40米长的大刀来砍你。

总结

Ellipsis本身没有什么特殊的东西,它只是一个有着特殊类型的单例。Python提供这个对象给你在一些特殊情况下做某些语法上的扩展,但通常情况下没什么强行使用的价值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值