在 Python 3.6 中将 ABCMeta 与 __init_subclass__ 组合时出现类型错误

2024-04-10

我正在尝试使用 python 3.6 的新功能__init_subclass__特征 (PEP 487 https://www.python.org/dev/peps/pep-0487/)与abc模块。它似乎不起作用。以下代码:

from abc import ABCMeta
class Initifier:
    def __init_subclass__(cls, x=None, **kwargs):
        super().__init_subclass__(**kwargs)
        print('got x', x)

class Abstracted(metaclass=ABCMeta):
    pass

class Thingy(Abstracted, Initifier, x=1):
    pass

thingy = Thingy()

运行时产生以下结果:

Traceback (most recent call last):
  File "<filename>", line 10, in <module>
    class Thingy(Abstracted, Initifier, x=1):
TypeError: __new__() got an unexpected keyword argument 'x'

如果 Abstracted 不使用,一切都会正常工作ABCMeta元类。

此错误具有相当的弹性,例如,以下代码仍然会失败并出现类似的类型错误(大概是因为元类'__new__在类实例化时运行,而父类'__new__在对象实例化之前不会运行)。

from abc import ABCMeta

class Initifier:
    def __new__(cls, name, bases, dct, x=None, **kwargs):
        return super().__new__(cls, name, bases, dct, **kwargs)

    def __init_subclass__(cls, x=None, **kwargs):
        super().__init_subclass__(**kwargs)
        print('got x', x)

class Abstracted(metaclass=ABCMeta):
    pass

class Thingy(Initifier, Abstracted, x=1):
    pass

thingy = Thingy()

谁能确认这是 Python 3.6 中的一个错误abc模块和/或__init_subclass__执行? (我可能正在使用__init_subclass__错误。)有人有解决方法吗?


这是一个错误abc.ABCMeta,由于设计上的缺陷__init_subclass__。我建议举报。

现在几乎每个存在的元类都应该将意外的关键字参数传递给super().__new__ so type.__new__可以将它们传递给__init_subclass__,但是 ABCMeta 和可能还有大量其他元类还没有这样做。abc.ABCMeta.__new__窒息x关键字参数而不是传递它,导致您看到的异常。

尝试使用__init_subclass__带有尚未针对新设计​​更新的元类的关键字参数将不起作用。您必须等待您使用的元类被修补。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Python 3.6 中将 ABCMeta 与 __init_subclass__ 组合时出现类型错误 的相关文章

随机推荐