document necessary tests

This commit is contained in:
Martin Teichmann 2016-07-17 11:28:42 +02:00 committed by GitHub
parent 49a5c29d8f
commit 3d20e37391
1 changed files with 48 additions and 0 deletions

View File

@ -297,6 +297,54 @@ replace the current ``type`` and ``object`` with the following::
pass pass
Backward compatibility issues
=============================
The exact calling sequence in ``type.__new__`` is slightly changed, raising
fears of backwards compatibility. It should be assured by tests that common use
cases behave as desirerd.
The following class definitions (except the one defining the metaclass)
continue to fail with a ``TypeError`` as superfluous class arguments are passed::
class MyMeta(type):
pass
class MyClass(metaclass=MyMeta, otherarg=1):
pass
MyMeta("MyClass", (), otherargs=1)
import types
types.new_class("MyClass", (), dict(metaclass=MyMeta, otherarg=1))
types.prepare_class("MyClass", (), dict(metaclass=MyMeta, otherarg=1))
A metaclass defining only a ``__new__`` method which is interested in keyword
arguments now does not need to define an ``__init__`` method anymore, as the
default ``type.__init__`` ignores keyword arguments. This is nicely in line
with the recommendation to override ``__new__`` in metaclasses instead of
``__init__``. The following code does not fail anymore::
class MyMeta(type):
def __new__(cls, name, bases, namespace, otherarg):
return super().__new__(cls, name, bases, namespace)
class MyClass(metaclass=MyMeta, otherarg=1):
pass
Only defining a ``__init__`` in a metaclass continues to fail with ``TypeError``
if keyword arguments are given::
class MyMeta(type):
def __init__(self, name, bases, namespace, otherarg):
super().__init__(name, bases, namespace)
class MyClass(metaclass=MyMeta, otherarg=1):
pass
Defining both ``__init__`` and ``__new__`` continues to work fine.
Rejected Design Options Rejected Design Options
======================= =======================