Я использую PyRight и (до сих пор) с радостью учу студентов создавать списки с помощью «умножения», например 44 * [Нет]. Однако, когда результирующий список имеет тип, скажем, List[Union[int, None]], я не нашел способа убедить PyRight приписать тип Union[int, None] элементу None во внутреннем списке, и в результате PyRight обеспокоен тем, что я пытаюсь навязать ковариацию списка, чтобы назначить тип List[Union[int, None]] списку, который имеет псевдоним в другом месте как имеющий тип Список[Нет]. Я пробовал различные способы оформления внутреннего None, чтобы указать PyRight, что его всегда следует рассматривать как Union[int, None], но мне пока это не удалось.
Вот пример кода, чтобы показать, что я имею в виду:
Код: Выделить всё
from typing import List, Union
def new_thingy() -> List[Union[int,None]]:
# attempt number one: PyRight indicates type error:
l : List[Union[int,None]] = 4 * [None]
# attempt number two: same problem
m : Union[int,None] = None
n : List[Union[int,None]] = 4 * [m]
# attempt number three, works but doesn't scale:
o : List[Union[int,None]] = [None,None,None,None]
# works - steer students away from multiplication?
p : List[Union[int,None]] = [None for _ in range(4)]
return p
Я много работал с Typed Racket, где обычно можно скрыть приписывание типа (то есть что-то вроде формы (foo : Bar) вокруг внутреннего значения, чтобы убедить средство проверки типов рассмотреть возможность использования этого типа. Есть ли у PyRight форма приписывания типа на уровне выражения, которую я еще не обнаружил?
>
Подробнее здесь:
https://stackoverflow.com/questions/798 ... n-operator