Почему вывод дисперсии для параметров типа включает `__init__`?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Почему вывод дисперсии для параметров типа включает `__init__`?

Сообщение Anonymous »

Из официальных документов: < /p>

Введение явного синтаксиса для общих классов в 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 
, natedTuple , Frozenset .
[*] Мы называем __init __ при создании объектов, и это не имеет значения. Например, print_float_val принимает экземпляр mycontainer [float] , поэтому объект был бы создан до передачи этой функции.
[/list]

Подробнее здесь: https://stackoverflow.com/questions/796 ... clude-init
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Почему вывод дисперсии для параметров типа включает `__init__`?
    Anonymous » » в форуме Python
    0 Ответы
    2 Просмотры
    Последнее сообщение Anonymous
  • Понимание дисперсии типа в протоколах Python с общими типами
    Anonymous » » в форуме Python
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous
  • Понимание дисперсии типа в протоколах Python с общими типами
    Anonymous » » в форуме Python
    0 Ответы
    8 Просмотры
    Последнее сообщение Anonymous
  • Не может определить, какой экземпляр перегруженной функции "init :: init" предназначен
    Anonymous » » в форуме C++
    0 Ответы
    10 Просмотры
    Последнее сообщение Anonymous
  • Вывод типа шаблона включает константу?
    Anonymous » » в форуме C++
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»