class error
Rhodri James
rhodri at wildebst.demon.co.uk
Sat Mar 19 20:08:16 EDT 2011
On Sat, 19 Mar 2011 02:15:55 -0000, Terry Reedy <tjreedy at udel.edu> wrote:
> On 3/18/2011 5:27 PM, monkeys paw wrote:
>>>> TypeError: Error when calling the metaclass bases
>>>> module.__init__() takes at most 2 arguments (3 given)
>> OK, i overlooked that and the error was not very enlightening.
>
> A detailed explanation: every module is an instance of a class we will
> call Module. Every class is an instance of some class, its metaclass.
> The default metaclass, in the absence of any indication otherwise, is
> class type. So your class statement was translated to
>
> type('FileInfo',(UserDict,), d)
> where d is a dict mappint '__init__' to the function object.
>
> type.__new__ checks the types (metaclasses) of each of the base classes.
> In particular, it sees that type(UxerDict) is Module, not type. Since it
> assumed that UserDict is a class (since you said it was), it assumed
> that Module is a proper metaclass and called
> Module('FileInfo',(UserDict,), d)
> But Module is not a metaclass and does not expect the tuple of base
> classes, and Module.__new__ passed too much to Module.__init__.
>
> Since others have made the same mistake, I opened an issue to improve
> the message.
> http://bugs.python.org/issue11604
It has to be said that the confusion is exacerbated by ignoring PEP-8
and using the same (CamelCase) name for the module and the class.
That does provide a rich source of errors in cases like this.
--
Rhodri James *-* Wildebeest Herder to the Masses
More information about the Python-list
mailing list