Coincidentally I was just talking about how strange it is that @deprecated is the only decorator that applies to individual overloads.THe natural solution to this inconsistency that came to mind was indeed something like this.
I don’t think that it should be on the “value side” of things, but rather on the typing side, and think that Deprecated is the way to go here. An important advantage of this is the ability to deprecate constants, attributes, type aliases, etc. It would also allow you to deprecate an entire function (instead of specific parameters) by wrapping the return type in a def foo() -> Deprecated[T, "use spam() instead"]: ....