заведомо знаю какой он
Типа есть функция
def func() -> Foo | Bar
И в другом месте я пишу
a = func()
Но точно знаю, что это Foo
Как мне это указать?
Откуда знаешь?
Убрать юнион, взять typing.overload. или вообще делать не так
Есть typing.cast, но это прям совсем крайний случай
Ну вот у меня идея (может быть дурная) - сделать __getitem__ и в зависимости от того что передаешь в value - он возвращает разные типы.
К сожалению arg в _getitem__ одного и того же типа
покажи больше кода
Если ты в конкретном месте знаешь по какой-то причине, что там Foo: a) assert value is Foo — проверить в рантайме b) value = typing.cast(Foo, value) — без проверки в рантайме c) подумать, как сделать так, чтобы юниона всё-таки не было — зависит от кода
class A: pass class B: pass mapping = { “a”: A, “b”: B } class Foo: def __getitem__(self, arg): return mapping[arg]
class Foo: @overload def __getitem__(self, arg: Literal["a"]) -> A: ... @overload def __getitem__(self, arg: Literal["b"]) -> B: ... def __getitem__(self, arg: str) -> A | B: return mapping[arg]
Теперь надо понять как сделать это автоматически чтобы был single source of truth - mapping
Обсуждают сегодня