Nick Coghlan added the comment:
The types.new_class docs are quite clear that the supplied keyword arguments
are equivalent to those provided in the type header (if you want to
pre-populate the namespace, that's what exec_body is for). The problem here is
that the dual signature of type (retrieving the type of an existing object, or
creating a new one), and the fact that type.__prepare__ ignores all arguments,
means the error message is thoroughly misleading when you pass an unknown
keyword argument:
>>> type.__prepare__(foo=1)
{}
>>> type("Example", (), {}, foo=1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: type() takes 1 or 3 arguments
>>> class Example(foo=1): pass
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: type() takes 1 or 3 arguments
>>> import types
>>> types.new_class("Example", (), dict(foo=1))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/ncoghlan/devel/py3k/Lib/types.py", line 52, in new_class
return meta(name, bases, ns, **kwds)
TypeError: type() takes 1 or 3 arguments
The reason type.__prepare__ ignores its arguments is to make it easy for people
to use type to anchor a custom metaclass hierarchy and call
super().__prepare__(name, bases, **kwds) without needing to worry much about
filtering the keyword arguments. (The class machinery intercepts the metaclass
hint and never passes it to __prepare__ or the metaclass constructor).
That means the real change needed here is to update type's error message for
bad arguments to properly report unknown keyword errors when using the PEP 3115
metaclass API.
----------
assignee: -> docs@python
components: +Documentation
nosy: +docs@python
title: Incorrect use of type function in types.new_class -> Misleading error
from type() when passing unknown keyword argument
_______________________________________
Python tracker <[email protected]>
<http://bugs.python.org/issue17179>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com