Python 3.3+inspectпонятие
inspect.Signature
сигнатуры
Объект сигнатуры: упорядоченные параметры функции и аннотация результата. Его возвращает inspect.signature(); умеет проверить вызов через bind().
Синтаксис
sig = inspect.signature(func); sig.parameters; sig.return_annotation; sig.bind(*args, **kwargs)
Конструктор зовут редко — сигнатуру получают из inspect.signature(f), а Signature(...) нужен, чтобы подставить свою через __signature__. Объект неизменяемый: правка — только копией через replace(). bind() проверяет аргументы без вызова функции и бросает TypeError с тем же смыслом, что и настоящий вызов. Для части встроенных функций (max, range, dict) сигнатуры нет вовсе — это ValueError, а не пустой результат; устаревший getfullargspec в этом не лучше и вдобавок теряет «/».
Примеры
import inspect
def f(a, b=2, *args, c, **kw): pass
sig = inspect.signature(f)
print(sig) # → (a, b=2, *args, c, **kw)
print(list(sig.parameters)) # → ['a', 'b', 'args', 'c', 'kw']
try:
sig.bind(1)
except TypeError as e:
print(e) # → missing a required argument: 'c'
import inspect
P = inspect.Parameter
params = [P('x', P.POSITIONAL_OR_KEYWORD), P('y', P.KEYWORD_ONLY, default=0)]
print(inspect.Signature(params, return_annotation=int)) # → (x, *, y=0) -> int
bad = [P('a', P.POSITIONAL_OR_KEYWORD, default=1), P('b', P.POSITIONAL_OR_KEYWORD)]
try:
inspect.Signature(bad)
except ValueError as e:
print(e) # → non-default argument follows default argument
import inspect
print(inspect.signature(len)) # → (obj, /)
try:
inspect.signature(max)
except ValueError as e:
print(e) # → no signature found for builtin <built-in function max>
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности