Как указать аргумент функции как словарь с родительским классом в PythonPython

Программы на Python
Ответить
Anonymous
 Как указать аргумент функции как словарь с родительским классом в Python

Сообщение Anonymous »

Я хотел бы обозначить функцию как сопоставление между экземплярами класса или его дочерних элементов и значением. take_mapping ниже приведен пример. Однако я получаю статическую ошибку ввода при использовании следующего:

Код: Выделить всё

from collections.abc import Mapping

class Parent:
pass

class Child(Parent):
pass

assert issubclass(Child, Parent)

def takes_mapping(mapping: Mapping[Parent, int]):
return

child = Child()
my_dict: dict[Child, int] = {child: 1}
my_mapping: Mapping[Child, int] = {child: 1}

takes_mapping(my_dict)  # typing error...
takes_mapping(my_mapping)  # same basic error, involving invariance (see below)
Pyright выдает следующую ошибку:

Код: Выделить всё

Argument of type "dict[Child, int]" cannot be assigned to parameter "mapping" of type "Mapping[Parent, int]" in function "takes_mapping"
"dict[Child, int]" is not assignable to "Mapping[Parent, int]"
Type parameter "_KT@Mapping" is invariant, but "Child" is not the same as "Parent" reportArgumentType
Как я могу указать аргументу на сопоставление таким образом, чтобы ключи могли быть экземпляром Parent или любым из его дочерних элементов (без ошибок ввода)? В моем случае мы можем ввести дополнительные дочерние элементы Parent, и было бы хорошо, что нам не нужно было связывать подсказку с иерархией, т. е. Union на самом деле не будет выражать то, что требуется, поскольку это зависит на конкретных объединенных типах.


Подробнее здесь: https://stackoverflow.com/questions/791 ... -in-python
Ответить

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

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

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

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

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