a type without a __mro__?
Alex Martelli
aleaxit at yahoo.com
Sat Feb 5 10:17:10 EST 2005
Fredrik Lundh <fredrik at pythonware.com> wrote:
> Alex Martelli wrote:
>
> > Can anybody suggest where to find (within the standard library) or how
> > to easily make (e.g. in a C extension) a type without a __mro__, except
^^^^^^
> > for those (such as types.InstanceType) which are explicitly recorded in
> > the dispatch table copy._deepcopy_dispatch...?
>
> something like this?
>
> >>> import re
> >>> x = re.compile("")
> >>> x
> <_sre.SRE_Pattern object at 0x00B2F7A0>
> >>> x.__mro__
> Traceback (most recent call last):
> File "<stdin>", line 1, in ?
> AttributeError: __mro__
Alas, no -- wish it were so easy! It does need to be a TYPE, not just
any object, to reproduce the bug that was reported about 2.3.5c1's
copy.py. The relevant code in copy.py does the equivalent of:
>>> type(x).__mro__
(<type '_sre.SRE_Pattern'>, <type 'object'>)
>>>
not of just x.__mro__, which would easily be made to fail.
How a type(whatever) can end up without a __mro__ in 2.3.* is rather
murky to me; looks like something strange must be happening wrt the
type's flags, or something. Normal types such as _sre.SRE_Pattern, or
the Copyable type I put in _testcapi, just sprout an __mro__ without
even trying. Ah well, thanks anyway -- guess I'll commit the fix (using
inspect.getmro(cls) rather than cls.__mro__) even though I don't have a
unit test to show it's necessary and sufficient:-(
Alex
More information about the Python-list
mailing list