Why do descriptors (and thus properties) only work on attributes.

Antoon Pardon apardon at forel.vub.ac.be
Tue Mar 1 06:35:58 EST 2005


Op 2005-02-28, Dima Dorfman schreef <dima at trit.invalid>:
> On 2005-02-28, Antoon Pardon <apardon at forel.vub.ac.be> wrote:
>> Op 2005-02-28, Diez B. Roggisch schreef <deetsNOSPAM at web.de>:
>>> I still don't see how that is supposed to work for "a lot of interesting
>>> things". Can you provide examples for one of these interesting things?
>>
>> Lazy evaluation where the value of something is calculated the first
>> time it is needed but accessed from some storage if it is needed again.
>
> I do this all the time. It's not very hard and doesn't require any
> extra language support, but I would like for there to be an
> authoritative list of type slots (autopromise_ops).
>
>     import operator
>
>     def promise(thunk):
>         x = []
>         def promised():
>             if not x:
>                 x.append(thunk())
>             return x[0]
>         return promised
>
>     autopromise_ops = [x for x in dir(operator) if x.startswith('__')]
>     autopromise_ops += ['__getattribute__', '__call__', '__str__', '__repr__']
>     autopromise_ops += ['__getattr__', '__setattr__', '__delattr__']
>
>     def autopromise(thunk):
>         p = promise(thunk)
>         d = {}
>         for op in autopromise_ops:
>             def bindhack(op=op):
>                 return lambda self, *a, **kw: getattr(p(), op)(*a, **kw)
>             d[op] = bindhack()
>         return type('autopromise', (), d)()
>
>     def test():
>
>         lis = []
>
>         def thunk():
>             lis.append('ran thunk')
>             return 'value'
>
>         s = autopromise(thunk)
>         p = s * 30
>         assert p == 'value' * 30
>         p = s * 10
>         assert p == 'value' * 10
>         assert lis == ['ran thunk']          # Just once
>
>         print 'autopromise sanity test passed'
>
> An autopromise object is good almost everywhere the real one would be,
> and usually the only way to tell the difference is to call id or type
> on it. The main exception is when the thunk returns a builtin type
> (like a string or int) and you want to pass it to a builtin function
> that expects a particular type (this would also apply to Python
> functions that break duck typing on purpose, but those would just be
> getting the breakage they deserve).

Hmm, I'll have to take your word for it, because for the moment I
don't see what is going on. I'll have to study this some time.

-- 
Antoon Pardon



More information about the Python-list mailing list