如何跟踪传递给元类的关键字?(How to keep track of keywords passe

2019-10-31 05:56发布

我有一个接受的关键字参数元类:

class M(type):
    def __new__(cls, *args, **kwargs):
        print(*kwargs.items())
        super().__new__(cls, *args)

它按预期工作:

class A(metaclass=M, test='X'): pass

结果中的对象A和打印输出

('test', 'X')

我想提出的一个副本A使用类似这样 :

def copy_class(cls, name=None):
    if name is None:
        name = cls.__name__
    return type(cls)(name, cls.__bases__, dict(cls.__dict__))

A_copy = copy_class(A, 'A_copy')

但是,关键字不存在。 这尤其是一个问题,当type(cls) 需要额外的参数或以其它方式产生不同的副作用时它们不存在。

我知道我可以有M藏匿关键字类对象的地方,但因为那时我的复制方法是很类依赖,这不是一个很好的解决方案。

有没有取回一类是在用Python创建的关键字,一个内置的方式吗?

Answer 1:

Python将不保存关键字参数为您服务。 这是简单的证明:

>>> class DoesntSaveKeywords(type):
...     def __new__(cls, name, bases, dict, **kwargs):
...         return super().__new__(cls, name, bases, dict)
... 
>>> class PrintsOnDel:
...     def __del__(self):
...         print('__del__')
... 
>>> class Foo(metaclass=DoesntSaveKeywords, keyword=PrintsOnDel()):
...     pass
... 
__del__

另外,我不认为试图复制一个类像,这是有道理的基本思想。 有没有保证类的__dict__看起来像什么最初传递给元类的构造函数,或者再次调用元类的构造函数会做任何远程合理的事情。



文章来源: How to keep track of keywords passed to metaclass?