Jelle Zijlstra writes:
In fact, `typing.Optional` means that something can be None, *not* that it is an optional argument.
You're missing my point. Yes, the *implementation* is that the object can be None. But that's far more clearly expressed by Union[T, None] if that's what you *mean*, and it only costs 3 characters. Optional clearly was intended to mean that this type is for use in optional arguments.
Having "Optional" at all may have been a bad choice, since (1) it is redundant given you still need to specify "= None" to actually make it optional, and (2) usually shouldn't be used for optional arguments that don't default to None (because in such cases None usually isn't an acceptable argument). I am persuaded of that now: it doesn't express the idea "this type is for use in optional formal arguments".
But I am convinced by arguments about the *language* (including type expressions) that are about *what it expresses*, as in the paragraph above (natural language) or your example function f (code example). Arguments about what something *is* in the implementation, or vague statements that things "could" be misinterpreted aren't terribly helpful to me, YMMV. And I think they lead to bad decisions about the language.