Для примера давайте забудем о len( ).
Код: Выделить всё
class HasSize(Protocol):
def size(self) -> int: pass
class HasLength(Protocol):
def length(self) -> int: pass
Я мог бы предоставить классы примесей:
Код: Выделить всё
class LengthAsSize:
def length(self) -> int:
return self.size()
#and vice versa
Я мог бы заставить их расширить оба протокола:< /p>
Код: Выделить всё
class LengthAsSize(HasLength, HasSize):
def length(self) -> int:
return self.size()
#and vice versa
Код: Выделить всё
ProtocolКод: Выделить всё
class Impl(NamedTuple, LengthAsSize): # will complain about metaclasses
x: list
def size(self) -> int:
return len(self.x)
Код: Выделить всё
def length_as_size[T: HasLength](t: type[T]) -> T and HasSize: #THIS IS THE ISSUE
def size(self) -> int:
return self.length()
t.size = size
return t
#this won't raise any issues, but static checked won't recognize this as HasLength; it will still recognize it as HasSize, though
@length_as_size
class Impl(NamedTuple):
x: list
def size(self) -> int:
return len(self.x)
Как мне сформулировать тип, который расширяет оба других типа таким образом?
Это не тип объединения - объединение - это "один или другой" ; мне нужно "один и другой".
Подробнее здесь: https://stackoverflow.com/questions/790 ... ther-types