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Сообщить о неточности