Well, with the newer optional typing, it became def foo(name: Optional[str]) -> Optional[str]: ... and now def foo(name: str | None) -> str | None: ... (No need to import Optional) It's quite nice.
As for Rust, recall that Result is also a very similar union type. I think a lot of the aversions people have had to static typing have mostly just been about poor expressiveness in clunky type systems.
Well, with the newer optional typing, it became
def foo(name: Optional[str]) -> Optional[str]: ...
and nowdef foo(name: str | None) -> str | None: ...
(No need to import Optional) It's quite nice.As for Rust, recall that Result is also a very similar union type. I think a lot of the aversions people have had to static typing have mostly just been about poor expressiveness in clunky type systems.