libb.makecls

makecls(*metas, **options)[source]

Class factory that resolves metaclass conflicts automatically.

When multiple inheritance involves conflicting metaclasses, this factory generates a compatible metaclass that inherits from all necessary metaclasses.

Parameters:
  • metas (type) – Explicit metaclasses to use.

  • options (Any) –

    Keyword options:

    • priority: If True, given metaclasses take precedence over base metaclasses.

Return type:

Callable[[str, tuple[type, ...], dict[str, Any]], type]

Returns:

A class factory function that creates classes with resolved metaclasses.

Metaclass Conflict Resolution:

>>> class M_A(type):
...     pass
>>> class M_B(type):
...     pass
>>> class A(metaclass=M_A):
...     pass
>>> class B(metaclass=M_B):
...     pass

Normal Inheritance Fails:

>>> class C(A,B):
...     pass
Traceback (most recent call last):
...
TypeError: metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases

Using makecls Resolves the Conflict:

>>> class C(A,B,metaclass=makecls()):
...    pass
>>> (C, C.__class__)
(<class '....C'>, <class '...._M_AM_B'>)

Metaclass Caching:

>>> class D(A,B,metaclass=makecls()):
...    pass
>>> (D, D.__class__)
(<class '....D'>, <class '...._M_AM_B'>)
>>> C.__class__ is D.__class__
True