Both of these issues are not insurmountable:
from typing import TypeVar
def generic(*typespec):
unset = object()
glbls = globals()
store = {t.__name__: glbls.get(t.__name__, unset) for t in typespec}
for t in typespec:
glbls[t.__name__] = t
def decorator(function):
for name, value in store.items():
if value is unset:
del glbls[name]
else:
glbls[name] = value
return function
return decorator
@generic(TypeVar('T'))
def myfunction(x: T):
...
With the __coannotations__ magic, that would probably not even have to touch global scope.
Of course we haven’t really won anything by still needing to write out the TypeVar('T') here, so this is really only addressing the points made above.