Me encanta la verificación de tipo Pylance.
Sin embargo, si tengo una variable var: Union[None, T] , donde T implementa foo , pylance arrojará un error en:
var.foo() ya que el tipo None no implementa foo .
Hay alguna manera de resolver esto? Una forma de decirle a Pylance "Esta variable es None a veces, pero en este caso estoy 100% seguro de que se asignará
Hay muchas formas de obligar a un verificador de tipos a aceptar esto.
Usar assert :
from typing import Union def do_something(var: Union[T, None]): assert var is not None var.foo()Levanta alguna otra excepción :
from typing import Union def do_something(var: Union[T, None]): if var is None: raise RuntimeError("NO") var.foo() Use una declaración if :
from typing import Union def do_something(var: Union[T, None]): if var is not None: var.foo() Use typing.cast , una función que no hace nada en tiempo de ejecución pero obliga a un verificador de tipos a aceptar que una variable es de cierto tipo:
from typing import Union, cast def do_something(var: Union[T, None]): var = cast(T, var) var.foo()Apague el verificador de tipos para esa línea :
from typing import Union def do_something(var: Union[T, None]): var.foo() # type: ignore Tenga en cuenta también que, si bien no hace ninguna diferencia en la forma en que un verificador de tipo interpreta su anotación de tipo (los dos son semánticamente idénticos), también puede escribir escribiendo typing.Union[T, None] como typing.Optional[T] , que podría decirse que es una sintaxis un poco más agradable. En Python> = 3.10 (o anterior si tiene from __future__ import annotations en la parte superior de su código), incluso puede escribir tipos de Union con el | operador, es decir, T | None