[New-bugs-announce] [issue17421] Drop restriction that meta.__prepare__() must return a dict (subclass)

Eric Snow report at bugs.python.org
Thu Mar 14 21:20:27 CET 2013


New submission from Eric Snow:

Currently type_new() in Objects/typeobject.c enforces a restriction that the namespace be a dict or dict subclass.  It does this via the PyArg_ParseTupleAndKeywords() call there.

This means that valid mappings may not be used even though they should work just fine.  A demonstration of the problem is below.

I've attached a patch that relaxes this restriction.  Should we also add a note in the docs that type() will take anything for namespace that dict() will take?

Demonstration
-------------

class Meta(type):
    @classmethod
    def __prepare__(cls, name, bases, **kwargs):
        return ClassMapping()

from collections import MutableMapping
class ClassMapping(MutableMapping):
    def __init__(self, *args, **kwargs):
        self._dict = dict(*args, **kwargs)
    def __len__(self):
      return len(self._dict)
    def __iter__(self):
        return iter(self._dict)
    def __getitem__(self, key):
        return self._dict[key]
    def __setitem__(self, key, value):
        self._dict[key] = value
    def __delitem__(self, key):
        del self._dict[key]

>>> class X(metaclass=Meta):
...     pass
...
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: type() argument 3 must be dict, not ClassMapping

----------
files: type-namespace-restriction.diff
keywords: patch
messages: 184187
nosy: eric.snow, ncoghlan
priority: normal
severity: normal
stage: patch review
status: open
title: Drop restriction that meta.__prepare__() must return a dict (subclass)
type: enhancement
versions: Python 3.4
Added file: http://bugs.python.org/file29408/type-namespace-restriction.diff

_______________________________________
Python tracker <report at bugs.python.org>
<http://bugs.python.org/issue17421>
_______________________________________


More information about the New-bugs-announce mailing list