@@ -86,3 +86,34 @@ so it's better not to combine metaclasses and class hierarchies:
8686 such as ``class A(metaclass=f()): ... ``
8787* Mypy does not and cannot understand arbitrary metaclass code.
8888* Mypy only recognizes subclasses of :py:class: `type ` as potential metaclasses.
89+
90+ For some builtin types, mypy assumes that their metaclass is :py:class: `abc.ABCMeta `
91+ even if it's :py:class: `type `. In those cases, you can either
92+
93+ * use :py:class: `abc.ABCMetaclass ` instead of :py:class: `type ` as the
94+ superclass of your metaclass if that works in your use case,
95+ * mute the error with ``# type: ignore[metaclass] ``, or
96+ * compute the metaclass' superclass dynamically, which mypy doesn't understand
97+ so it will also need to be muted.
98+
99+ .. code-block :: python
100+
101+ import abc
102+
103+ assert type (tuple ) is type # metaclass of tuple is type
104+
105+ # the problem:
106+ class M0 (type ): pass
107+ class A0 (tuple , metaclass = M1 ): pass # Mypy Error: metaclass conflict
108+
109+ # option 1: use ABCMeta instead of type
110+ class M1 (abc .ABCMeta ): pass
111+ class A1 (tuple , metaclass = M1 ): pass
112+
113+ # option 2: mute the error
114+ class M2 (type ): pass
115+ class A2 (tuple , metaclass = M2 ): pass # type: ignore [ metaclass ]
116+
117+ # option 3: compute the metaclass dynamically
118+ class M3 (type (tuple )): pass # type: ignore [ metaclass ]
119+ class A3 (tuple , metaclass = M3 ): pass
0 commit comments