Python 3.3+inspectterm
inspect.BoundArguments
signatures
The result of Signature.bind(): which values went to which parameters. Its args and kwargs can be used to call the function.
Syntax
ba = sig.bind(*args, **kwargs); ba.apply_defaults(); func(*ba.args, **ba.kwargs)
arguments holds only the explicitly passed values: defaults are missing until apply_defaults() is called. The main use is fetching an argument by name no matter how it was passed, positionally or by keyword, which is how validating decorators work. arguments is a plain mutable dict, and editing it changes args and kwargs at once.
Examples
import inspect
def connect(host, port=5432, *, timeout=10):
return f'{host}:{port} t={timeout}'
ba = inspect.signature(connect).bind('db', timeout=3)
print(ba.arguments) # → {'host': 'db', 'timeout': 3}
ba.apply_defaults()
print(ba.arguments) # → {'host': 'db', 'port': 5432, 'timeout': 3}
print(connect(*ba.args, **ba.kwargs)) # → db:5432 t=3
import functools, inspect
def positive(name):
def deco(fn):
sig = inspect.signature(fn)
@functools.wraps(fn)
def wrapper(*args, **kwargs):
ba = sig.bind(*args, **kwargs)
ba.apply_defaults()
if ba.arguments[name] <= 0:
raise ValueError(f'{name} must be > 0')
return fn(*args, **kwargs)
return wrapper
return deco
@positive('n')
def repeat(s, n=1):
return s * n
print(repeat('ab', 2), repeat('x', n=3)) # → abab xxx
try:
repeat('a', 0)
except ValueError as e:
print(e) # → n must be > 0
See also
Open in the full glossarydocs.python.orgReport an inaccuracy