gpt4 book ai didi

python - __slots__ 与泛型类中的类变量冲突

转载 作者:行者123 更新时间:2023-11-28 17:13:27 24 4
gpt4 key购买 nike

我在 Python 的输入系统和 __slots__ 之间有冲突。这是一个可重现的小例子。

from typing import TypeVar, Generic, Sequence

T = TypeVar("T")

class TestGeneric(Sequence, Generic[T]):
__slots__ = ("test",)

def __init__(self, test: T):
self.test = [test]

def __iter__(self):
return iter(self.test)
def __len__(self):
return len(self.test)

def __contains__(self, item):
return item in self.test

def __getitem__(self, _):
return self.test[0]

现在每当我尝试指定内容类型时,例如

V = TestGeneric[int]

我明白了

ValueError: 'test' in __slots__ conflicts with class variable

我在没有插槽的类中经常使用泛型,因此我认为这个错误必须链接到__slots__。此外,如果删除 __slots__

,同一个类工作正常

最佳答案

我会说这是 typing 模块中的错误,它在创建新类型时没有正确考虑 __slots__

这个问题可以用这个非常简短的例子重现:

>>> class MyClass:
... __slots__ = ('my_member',)
...
>>> type('MySubClass', (MyClass,), dict(MyClass.__dict__))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: 'my_member' in __slots__ conflicts with class variable

上面对 type() 的类型调用等同于 typing 模块中幕后发生的事情。

这个异常是因为当你使用__slots__时,你指定的成员会自动添加到类型dict中:

>>> MyClass.__slots__
['my_member']
>>> MyClass.__dict__
mappingproxy({..., 'my_member': <member 'my_member' of 'MyClass' objects>, ...})

当我们执行 type('MySubClass', (MyClass,), dict(MyClass.__dict__)) 时,我们传递了 my_member 两次:一次通过 MyClass.__slots__,一旦通过 MyClass.__dict__,类型机制就会提示它。

除了避免使用 __slots__ 或调用 register() 而不是子类化之外,您对此无能为力。

关于python - __slots__ 与泛型类中的类变量冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45864273/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com