刚才无聊时折腾了一个高端大气上档次的等差数列生成器,演示结果如下:
>>> 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] 之类的),或是同时支持等比数列之类的我就不管了,有兴趣的可以自己实现。好了,本次装逼教程到此为止,我先睡觉了。
原文地址:Python 装逼篇之 Ellipsis, 感谢原作者分享。 那么前世我的目光一定一刻都没从你身上离开过吧!