Python Glossary Русский

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