Введение явного синтаксиса для общих классов в Python 3.12 устраняет необходимость указать дисперсию для параметров типа. Вместо этого, тип Шеккеры выведет дисперсию параметров типа на основе их использования в классе. Параметры типа выводятся как инвариантные, коварианты или противопоставленные в зависимости от того, как они используются.
Проблема такова, Тип Проверщики включают __init __ при предварительном заключении: они проверяют, есть ли __init __ typevar as paramrate. class = "lang-py prettyprint-override">
Код: Выделить всё
class MyContainer[T]: # This is covariant for all intended usecases
# Inferred as invariant because of `val: T`, but I need to pass the value somehow...
def __init__(self, val: T) -> None:
self.val = val
def get_val(self) -> T:
return self.val
def print_float_val(container: MyContainer[float]) -> None:
print(container)
int_container = MyContainer(1) # reveal_type: MyContainer[int]
print_float_val(int_container)
# main.py:15: error: Argument 1 to "print_float_val" has incompatible type "MyContainer[int]"; expected "MyContainer[float]" [arg-type]
< /code>
Я не могу представить, чтобы это поведение было очень полезным, потому что: < /p>
[list]
[*] Мое понимание ковариантных дженериков заключается в том, что они в основном (возможно, все) контейнеры только для чтения. В значительной степени все мои ковариантные типы контейнеров, которые я могу придумать о получении значений, которые он содержит во время инициализации: Tuple
[*] Мы называем __init __ при создании объектов, и это не имеет значения. Например, print_float_val принимает экземпляр mycontainer [float] , поэтому объект был бы создан до передачи этой функции.
[/list]
Подробнее здесь: https://stackoverflow.com/questions/796 ... clude-init