A constrained type variable.
typing.AnyStr
AnyStr = TypeVar('AnyStr', str, bytes)
def concat(a: AnyStr, b: AnyStr) -> AnyStr:
return a + b
concat("foo", "bar") OK, output has type 'str'
concat(b"foo", b"bar") OK, output has type 'bytes'
concat("foo", b"bar") Error, cannot mix str and bytes
Invalid use of AnyStr:
The type variable is used only once in the function signature,
so cannot be "solved" by the type checker
def greet_bad(cond: bool) -> AnyStr:
return "hi there!" if cond else b"greetings!"
The better way of annotating this function:
def greet_proper(cond: bool) -> str | bytes:
return "hi there!" if cond else b"greetings!"