[Python-ideas] List Revolution

Massimo Di Pierro massimo.dipierro at gmail.com
Sat Sep 10 18:35:21 CEST 2011


Here is my proposal which hopefully would settle the issue to rest

class List(list):
    """                                                                                                                                                                                           
    >>> a=List()                                                                                                                                                                                  
    >>> for i in range(100000): a.append(i)                                                                                                                                                       
    >>> print a.first                                                                                                                                                                             
    0                                                                                                                                                                                             
    >>> print a.second                                                                                                                                                                            
    1                                                                                                                                                                                             
    >>> print a.third                                                                                                                                                                             
    2                                                                                                                                                                                             
    >>> print a.twentieth                                                                                                                                                                         
    19                                                                                                                                                                                            
    >>> print a.twentysecond                                                                                                                                                                      
    21                                                                                                                                                                                            
    >>> print a.onehundredthirtyfifth                                                                                                                                                             
    134                                                                                                                                                                                           
    >>> print a.onethousandfivehundredandthirtyeighth                                                                                                                                                
    1537                                                                                                                                                                                          
    """
    def __getattr__(self,name):
        import re
        if name.endswith('first'): name = name[:-5]+'one'
        elif name.endswith('second'): name = name[:-6]+'two'
        elif name.endswith('third'): name = name[:-5]+'three'
        elif name.endswith('fth'): name = name[:-3]+'ve'
        elif name.endswith('hth'): name = name[:-3]+'th'
        elif name.endswith('ieth'): name = name[:-4]+'y'
        elif name.endswith('th'): name = name[:-2]
        subs = {
            'one':'+1',
            'two':'+2',
            'three':'+3',
            'four':'+4',
            'five':'+5',
            'six':'+6',
            'seven':'+7',
            'eigth':'+8',
            'nine':'+9',
            'ten':'+10',
            'eleven':'+11',
            'twelve':'+12',
            'thirteen':'+13',
            'fourteen':'+14',
            'fiftheen':'+15',
            'sixteen':'+16',
            'seventeen':'+17',
            'eighteen':'+18',
            'nineteen':'+19',
            'ten':'+10',
            'twenty':'+20',
            'thirty':'+30',
            'fourty':'+40',
            'fifthy':'+50',
            'sixty':'+60',
            'seventy':'+70',
            'eighty':'+80',
            'ninety':'+90',
            'hundred':')*100+(',
            'thousand':')*1000+(',
            'million':')*1000000+(',
            'billion':')*1000000000+(',
            'trillion':')*100000000000+(',
            'and',''}
        for key,value in subs.items(): name = name.replace(key,value)
        if '(' in name: name='('+name+')'
        name.replace('()','1')
        if not re.compile('[\d\+\*\(\)]+').match(name): return AttributeError
        try: return self[eval(name)-1]
        except: raise AttributeError


I would like to stress that the use of eval in this case is safe as the expression is first validated against a regex.

Massimo





More information about the Python-ideas mailing list