How do I extend, mimic, or emulate the range function?

后端 未结 2 1676
天涯浪人
天涯浪人 2020-12-28 15:27

I made a little generator function for character ranges:

>>> def crange(start, end):
...     for i in range(ord(start), ord(end)+1):
...                     


        
2条回答
  •  刺人心
    刺人心 (楼主)
    2020-12-28 16:12

    To add to Martin Konecny's answer. You probably want to use an internal range for everything and convert between chr and ord.

    class crange:
        def __init__(self, *args, **kwargs):
            args = [ord(arg) for arg in args]
            kwargs = {key: ord(val) for key, val in kwargs.items()}
            self.range = range(*args, **kwargs)
    
        def __iter__(self):
            for n in self.range:
                yield chr(n)
    
        def __contains__(self, c):
            return ord(c) in self.range
    
        def __getitem__(self, i):
            if isinstance(i, slice):
                ret = crange('\x00')
                ret.range = self.range[i]
                return ret
            else:
                return chr(self.range[i])
    
        def __repr__(self):
            return  "crange({}, {})".format(
                repr(chr(self.range.start)), repr(chr(self.range.stop)))
    
    r = crange('a', 'f')
    print(list(r))
    print('b' in r)
    print('f' in r)
    print(r[:2])
    

    In other words: if we can't subclass it we can use object composition.

提交回复
热议问题