[Python-Dev] PEP 455: TransformDict

Steven D'Aprano steve at pearwood.info
Tue Oct 8 02:23:36 CEST 2013


On Mon, Oct 07, 2013 at 02:55:44PM -0700, Ethan Furman wrote:
> On 10/07/2013 02:24 PM, Steven D'Aprano wrote:
> >On Fri, Oct 04, 2013 at 11:06:15PM +0200, Victor Stinner wrote:
> >
> >if type(self) is not dict:
> >     # This only applies to subclasses, not dict itself.
> >     try:
> >         transform = type(self).__transform__
> >     except AttributeError:
> >         pass
> >     else:
> >         key = transform(key)
> ># now use the key as usual
> >
> >
> >Am I barking up the wrong tree? Would this slow down dict access too
> >much?
> 
> Considering that __transform__ would usually not exist, and triggered 
> exceptions are costly, I think it would.

I fear you are right, particularly for subclasses. dict itself would 
only have the cost of testing whether the instance is an actual dict, 
which I presume is cheap. Still, given enough "cheap" tests, the overall 
performance hit could be significant.


[...]
> So something more like:
> 
>     transform =  getattr(self, '__transform__', None)
>     if transform is not None:
>         key = transform(key)
>     ...

One minor point, being a dunder method, it should be grabbed from the 
class itself, not the instance:

getattr(type(self), ...)



> A key difference (pun unavoidable ;) between __missing__ and __transform__ 
> is that __missing__ is only called when a key is not found, while 
> __transform__ needs to be called /every/ time a key is looked up:

Yes.



-- 
Steven


More information about the Python-Dev mailing list