[ZODB-Dev] PersistentMapping

Tim Peters tim at zope.com
Thu Nov 17 10:15:03 EST 2005


[Thomas Lotze]
> I just noticed two things about persistent.PersistentMapping:
>
> - It inherits from UserDict.UserDict. Is there any reason not to
>   inherit from dict directly, given that this has been possible
>   since Python 2.3 IIRC?

Try it ;-).  Or try to derive a class from, say, both `int` and `str` --
same outcome.  Ah, good, Jeremy already explained this, so I'll stop there.

His other point is also on target:  even if it were possible, it wouldn't
work as you expect.  Subclassing from builtin C types works well if you're
adding _new_ methods, or additional data members, but is an unpredictable
crapshoot if you're trying to change behavior of pre-existing methods.
Dicts in particular are very heavily used by the Python implementation, and
tons of Python's C code invokes base dict methods directly, unwilling to
endure the expense of checking for overrides.  Python's UserDict docs are
dreaming here:

    The need for this class has been largely supplanted by the
    ability to subclass directly from dict ...


> - Not all methods of the mapping interface are handled. In particular,
>   there's no reason not to handle pop() as popitems() is handled.
>   Unhandled methods that change the content of the dict lead to
>   especially nasty bugs as they seem to work OK during a transaction
>   while their effect is not permanent.

I agree pop() should be added.  Work up a patch, or at least open a bug
report?

Note that there are two relevant classes, PersistentDict and
PersistentMapping.  The code duplication there sucks (particularly because
they can-- and do --get out of synch), and one of them should be deprecated.



More information about the ZODB-Dev mailing list