簡體   English   中英

__slots__與泛型類中的類變量沖突

[英]__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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM