Python Glossary English

Python 3.3+inspectфункция

inspect.signature()

сигнатуры

Возвращает объект Signature вызываемого объекта: параметры, их виды, значения по умолчанию и аннотации.

Синтаксис

inspect.signature(callable, *, follow_wrapped=True, eval_str=False) -> Signature

Главное применение — проверить аргументы до вызова: signature(f).bind(*args, **kw) бросит TypeError с той же причиной, что и вызов, но ничего не исполнит. По умолчанию функция идёт по __wrapped__ и показывает исходную сигнатуру декорированной функции, у класса — параметры __init__ без self. Для части встроенных (max, dict) сигнатуры нет — ValueError. С 3.14 аннотации ленивые: def с ещё не определённым именем проходит, а signature() падает с NameError, пока не передать annotation_format.

Примеры

import inspect
def send(to, text='', *, retries=3):
    pass
sig = inspect.signature(send)
print(sig)  # → (to, text='', *, retries=3)
try:
    sig.bind(text='hi')  # send не вызывается
except TypeError as e:
    print(e)  # → missing a required argument: 'to'
print(sig.bind('ann', retries=5).arguments)  # → {'to': 'ann', 'retries': 5}
import inspect
class Point:
    def __init__(self, x, y=0):
        pass
print(inspect.signature(Point))  # → (x, y=0)
try:
    inspect.signature(max)
except ValueError as e:
    print(type(e).__name__)  # → ValueError
# Python 3.14+
import annotationlib, inspect
def load(path: Config) -> None:  # Config ещё не определён — def проходит
    pass
fmt = annotationlib.Format.STRING
print(inspect.signature(load, annotation_format=fmt))  # → (path: 'Config') -> 'None'
try:
    inspect.signature(load)
except NameError as e:
    print(e)  # → name 'Config' is not defined

См. также

Частые ошибки

Открыть в полном глоссарииdocs.python.orgСообщить о неточности