On Tue, 22 Mar 2016 04:48 am, Ian Kelly wrote:

> You don't actually need a metaclass for this:
> 
>>>> class Desc:
> ...     def __get__(self, obj, type=None):
> ...         if not type._cached_value:
> ...             type._cached_value = compute_value(type)
> ...         return type._cached_value


This won't quite work. What if the cached value happens to be falsey, yet
still expensive to compute? You should compare it to a known sentinel which
the expensive function will never return (possibly None). Or use a hasattr
test: if not hasattr(type, '_cached_value').

But my favourite is to combine them:


class Desc:
    def __get__(self, obj, type):
        sentinel = object()  # guaranteed to be unique
        value = getattr(type, _cached_value, sentinel)
        if value is sentinel:
            value = type._cached_value = compute_value(type)
        return value



Also, you don't need the default type=None. The descriptor protocol should
never call __get__ without supplying the type. The obj may be None, but I
don't believe there are any circumstances where type will be None.

Which is good, because if it is:

AttributeError: 'NoneType' object has no attribute '_cached_value'



-- 
Steven

-- 
https://mail.python.org/mailman/listinfo/python-list

Reply via email to