
12.10.21 00:03, Guido van Rossum пише:
But if I see
def Comparison(a: T, b: T) -> Literal[-1, 0, 1]: ...
my first thought is that it's a comparison function that someone hasn't finished writing yet, not a function type -- since if it did have at least one line of code in the body, it *would* be that.
I agree. There are also problems with variables substitution (indexing), union (operator "|") and introspection. We would need to add __getitem__, __or__, __args__, __parameters__ etc to all functions. There may be also conflicts with NewType which returns a callable. But can it be expressed via Protocol? class Comparison(Protocol, Generic[T]): def __call__(self, /, a: T, b: T) -> Literal[-1, 0, 1]: ... Then we can just add a decorator which turns a function into class: @functype def Comparison(a: T, b: T) -> Literal[-1, 0, 1]: ...