>>> from inspect import Signature, Parameter
>>> () ->
Signature()
>>> (arg0, arg1, arg2=None, arg3=None) ->
Signature(
[Parameter('arg0', Parameter.POSITIONAL_OR_KEYWORD),
Parameter('arg1', Parameter.POSITIONAL_OR_KEYWORD),
Parameter('arg2', Parameter.POSITIONAL_OR_KEYWORD, default=None),
Parameter('arg3', Parameter.POSITIONAL_OR_KEYWORD, default=None)],
return_annotation=str
)
>>> (arg0, arg1: int, arg2=None, arg3: float=None) -> str
Signature(
[Parameter('arg0', Parameter.POSITIONAL_OR_KEYWORD),
Parameter('arg1', Parameter.POSITIONAL_OR_KEYWORD, annotation=int),
Parameter('arg2', Parameter.POSITIONAL_OR_KEYWORD, default=None),
Parameter('arg3', Parameter.POSITIONAL_OR_KEYWORD, annotation=float, default=None)],
return_annotation=str
)
>>> (:, :, :, arg1, *, arg2) ->
Signature(
[Parameter('', Parameter.POSITIONAL_ONLY),
Parameter('', Parameter.POSITIONAL_ONLY),
Parameter('', Parameter.POSITIONAL_ONLY),
Parameter('arg1', Parameter.POSITIONAL_OR_KEYWORD),
Parameter('arg2', Parameter.KEYWORD_ONLY)]
)
>>> (:int, :float, *, keyword: complex) -> str
Signature(
[Parameter('', Parameter.POSITIONAL_ONLY, annotation=int),
Parameter('', Parameter.POSITIONAL_ONLY, annotation=float),
Parameter('keyword', Parameter.KEYWORD_ONLY, annotation=complex)],
return_annotation=str
)
Compare the above to their equivalents using Callable (and the experimental extension to Mypy):
>>> Callable[[], Any]
>>> Callable[[Arg(Any, 'arg0'), Arg(int, 'arg1'), DefaultArg(Any, 'arg2'), DefaultArg(float, 'kwarg3')], str]
>>> Callable[[Arg(), Arg(), Arg(), Arg(Any, 'arg1'), NamedArg(Any, 'arg2')], Any]
>>> Callable[[int, float, NamedArg(complex, 'keyword')], Any]
The proposed signature literal syntax is shorter, just as clear and imo nicer to read.
Here is what it looks like in annotations: