__prepare__ metaclass's method

Peter Otten __peter__ at web.de
Fri Oct 28 10:09:49 EDT 2016


ast wrote:

> Hi
> 
> On python doc here:
> 
> https://docs.python.org/3.4/reference/datamodel.html
> 
> it is said about __prepare__ metaclass's method:
> 
> If the metaclass has a __prepare__ attribute, it is called as
> namespace = metaclass.__prepare__(name, bases, **kwds)
> where the additional keyword arguments, if any, come from
> the class definition.
> 
> I don't understand what they call the "class definition".
> 
> So I took their example and add a print(kwds)
> 
> class OrderedClass(type):
> 
>      @classmethod
>      def __prepare__(metacls, name, bases, **kwds):
>         print(kwds)
>         return collections.OrderedDict()
> 
>      def __new__(cls, name, bases, namespace, **kwds):
>         result = type.__new__(cls, name, bases, dict(namespace))
>         result.members = tuple(namespace)
>         return result
> 
> class A(metaclass=OrderedClass):
>     def one(self): pass
>     def two(self): pass
>     def three(self): pass
>     def four(self): pass
> 
> but print(kwds) outputs an empty dictionnary {}
> 
> So what kwds is supposed to contains ?
> 
> Thx

>>> class T(type):
...     def __new__(*args, **kw): return type.__new__(*args)
...     def __prepare__(*args, **kw):
...         print(kw)
...         return {}
...     def __init__(*args, **kw):
...         pass
... 
>>> class A(metaclass=T, answer=42):
...     pass
... 
{'answer': 42}

Adapted from 
<http://martyalchin.com/2011/jan/20/class-level-keyword-arguments/>.





More information about the Python-list mailing list