![](/img/trans.png)
[英]pip install fails with “ValueError: 'format' in __slots__ conflicts with class variable”
[英]__slots__ conflicts with a class variable in a generic class
我在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
我在沒有插槽的類中使用Generics
,因此我認為這個錯誤必須與__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()
而不是子類化之外,你無能為力。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.