Python 的 Ellipsis 对象
近来由于某些无聊原因在研读 Python 的文档,发现一个适合装逼好玩的东西。
Ellipsis 对象。
在 Python 3 中你可以直接写...
来得到这玩意。
>>> ...
Ellipsis
>>> type(...)
<class 'ellipsis'>
>>>
而在 2 中没有...
这个语法,只能直接写 Ellipsis
来获取。
>>> Ellipsis
Ellipsis
>>> 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)
>>> a
array([[0, 1, 2],
[3, 4, 5]])
>>> for x in np.nditer(a, op_flags=['readwrite']):
... x[...] = 2 * x
...
>>> a
array([[ 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/0
except ZeroDivisionError:
...
某天你听到旁边座位的小哥发出了一声 WTF,然后抄着 40 米长的大刀来砍你。
总结
Ellipsis 本身没有什么特殊的东西,它只是一个有着特殊类型的单例。Python 提供这个对象给你在一些特殊情况下做某些语法上的扩展,但通常情况下没什么强行使用的价值。
Ellipsis对象
写作 : ‘…’
中文解释:省略
该对象bool测试是为真
用途:
1.用来省略代码,作用类似于pass的一种替代方案,这是python的’TBD’(未确定内容)。
def fun():
…
2.循环数据结构, 一个复合对象包含指向自身的引用。
L = [1,2,3]
L.append(L)
print(L)
此时输出为[1,2,3,[…]]
3.用来模拟一些情况,使结果看起来更友好,如等差数列等。
4. 在函数中使用:
def testThreeDot(flag=...):
if flag:
print(flag)
else:...
转自:python小结之Ellipsis对象_zhuangkuoqi的博客-CSDN博客_ellipsis python