On 9 November 2010 18:35, Tres Seaver <tsea...@palladion.com> wrote:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
>
> On 11/09/2010 08:26 AM, Wichert Akkerman wrote:
>> On 11/9/10 14:22 , Brian Sutherland wrote:
>>> Log message for revision 118295:
>>>    Improve CPU performance of previous memory optimization
>>>
>>> Changed:
>>>    U   zope.interface/branches/jinty-mem/src/zope/interface/interface.py
>>>
>>> -=-
>>> Modified: zope.interface/branches/jinty-mem/src/zope/interface/interface.py
>>> ===================================================================
>>> --- zope.interface/branches/jinty-mem/src/zope/interface/interface.py       
>>>  2010-11-09 08:31:37 UTC (rev 118294)
>>> +++ zope.interface/branches/jinty-mem/src/zope/interface/interface.py       
>>>  2010-11-09 13:22:27 UTC (rev 118295)
>>> @@ -51,6 +51,7 @@
>>>       # infrastructure in place.
>>>       #
>>>       #implements(IElement)
>>> +    __tagged_values = None
>>>
>>>       def __init__(self, __name__, __doc__=''):
>>>           """Create an 'attribute' description
>>> @@ -72,22 +73,27 @@
>>>
>>>       def getTaggedValue(self, tag):
>>>           """ Returns the value associated with 'tag'. """
>>> -        return getattr(self, '_Element__tagged_values', {})[tag]
>>> +        if self.__tagged_values is None:
>>> +            return default
>>> +        return self.__tagged_values[tag]
>>
>> You can even optimise this further:
>>
>>        tv = self.__tagged_values
>>        if tv is None:
>>            return default
>>        return tv[tv]
>>
>> that avoids a second attribute lookup. You may also want to benchmark
>> that versus using a __tagged_values={} on the class and doing a simple
>> return self.__tagged_values.get(tag, default_
>
> - -1:  mutable class defaults are a bug magnet.

None is immutable so I don't think that is a problem in this case.

I think the is a possible threading issue with Element.setTaggedValue
and Specification.subscribe - if two threads called the method
concurrently, then one of the values might be lost. I think the
correct way to do it would be:

    tv = self.__tagged_values
    if tv is None:
        tv = self.__dict__.setdefault('_Element__tagged_values', {})
    tv[tag] = value

This does bring the name mangling back though.

Laurence
_______________________________________________
Zope-Dev maillist  -  Zope-Dev@zope.org
https://mail.zope.org/mailman/listinfo/zope-dev
**  No cross posts or HTML encoding!  **
(Related lists - 
 https://mail.zope.org/mailman/listinfo/zope-announce
 https://mail.zope.org/mailman/listinfo/zope )

Reply via email to