将此英文标题翻译为中文: 在Python 3.6中,将ABCMeta与__init_subclass__结合时发生TypeError错误

2024-10-01 11:31:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试使用python3.6的新的__init_subclass__特性(PEP 487)和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()

运行时产生以下结果:

^{pr2}$

如果Abstracted不使用ABCMeta元类,则一切正常。在

{{cd4>在实例化一个类之前,{cd4>仍然会失败,因为在实例化一个类之前,{cd4>仍然会出现类似的错误。在

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()

有人能确认这是Python3.6abc模块和/或__init_subclass__实现中的一个bug吗?(我可能用错了__init_subclass__)有人有解决办法吗?在


Tags: noneinitdefpasskwargsclassclsabc
1条回答
网友
1楼 · 发布于 2024-10-01 11:31:24

这是abc.ABCMeta中的一个缺陷,因为{}的设计中有一个缺陷。我建议上报。在

现在几乎所有存在的元类都应该将意外的关键字参数传递给super().__new__,这样type.__new__可以将它们传递给__init_subclass__,但是ABCMeta和其他很多元类可能还没有做到这一点。abc.ABCMeta.__new__阻塞了x关键字参数,而不是传递它,从而导致您看到的异常。在

尝试将__init_subclass__关键字参数与尚未为新设计更新的元类一起使用是行不通的。您必须等待您使用的元类被修补。在

相关问题 更多 >