Python 3.3+inspectпонятие
inspect.Parameter
сигнатуры
Один параметр сигнатуры: имя, вид (позиционный, именованный, *args, **kwargs), значение по умолчанию и аннотация.
Синтаксис
inspect.Parameter(name, kind, *, default=Parameter.empty, annotation=Parameter.empty)
«Нет значения по умолчанию» — это Parameter.empty, а не None: default=None — настоящее умолчание, и проверка «p.default is None» путает два случая. Вид параметра читают из p.kind (POSITIONAL_ONLY … VAR_KEYWORD), а не угадывают по звёздочкам в str(p); виды упорядочены и сравниваются через <. Объект неизменяемый: присваивание p.default падает с AttributeError, копию с другим значением даёт p.replace(default=...).
Примеры
import inspect
def f(a, /, b, *args, c, d=None, **kw): pass
for p in inspect.signature(f).parameters.values():
print(p.name, p.kind.name)
# → a POSITIONAL_ONLY / b POSITIONAL_OR_KEYWORD / args VAR_POSITIONAL / c KEYWORD_ONLY / d KEYWORD_ONLY / kw VAR_KEYWORD
# Python 3.11+
import inspect
params = inspect.signature(lambda c, d=None: 0).parameters
print(params['c'].default is inspect.Parameter.empty) # → True
print(params['d'].default is inspect.Parameter.empty, params['d'].default) # → False None
print(params['d'].replace(default=5)) # → d=5
try:
params['d'].default = 5
except AttributeError as e:
print(e) # → property 'default' of 'Parameter' object has no setter
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности