1import inspect
2from functools import singledispatch
3
4
5def assign_signature(func):
6    # This is intended to cover more complex signature-rewriting decorators.
7    func.__signature__ = inspect.signature(func)
8    return func
9
10
11@singledispatch
12def func(arg, kwarg=None):
13    """A function for general use."""
14    pass
15
16
17@func.register(int)
18def _func_int(arg, kwarg=None):
19    """A function for int."""
20    pass
21
22
23@func.register(str)
24@assign_signature
25def _func_str(arg, kwarg=None):
26    """A function for str."""
27    pass
28