Python 装逼篇之 Ellipsis
2014 12 5 02:41 AM 6465次查看
>>> maker = ProgressionMaker()
>>> maker[1, 2, ..., 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> maker[6, 13, ..., 34]
[6, 13, 20, 27, 34]
虽然看上去很厉害的样子,但其实没什么技术含量……先来介绍一下如何处理这种语法,其实只用到 object.__getitem__ 方法而已:
>>> class Test(object):
... def __getitem__(self, key):
... print key
...
>>> test = Test()
>>> test[1]
1
>>> test[:]
slice(None, None, None)
>>> test[1:9]
slice(1, 9, None)
>>> test[1:3:5]
slice(1, 3, 5)
>>> test[1, 5]
(1, 5)
>>> test[1, 2:3, :4:, ::]
(1, slice(2, 3, None), slice(None, 4, None), slice(None, None, None))
>>> test[1, 2, ..., 9, 10]
(1, 2, Ellipsis, 9, 10)
基本上没什么神奇的,除了最后一个的省略号变成了 Ellipsis。这玩意也没啥好解释的,就是 Python 的一个常量而已。所以开头写的那个 ProgressionMaker 也没啥神奇的,可以这样简单粗暴地实现:
class ProgressionMaker(object):
def __getitem__(self, key):
if isinstance(key, tuple) and len(key) == 4 and key[2] is Ellipsis:
return range(key[0], key[-1] + 1, key[1] - key[0])
至于错误处理、支持更多参数(例如 maker[3, 7, 11, ..., 31, ..., 55, 59] 之类的),或是同时支持等比数列之类的我就不管了,有兴趣的可以自己实现。好了,本次装逼教程到此为止,我先睡觉了。
0条评论 你不来一发么↓