Канонизация аргов и кваргов в аргументно-каноническую форму - PullRequest
1 голос
/ 29 апреля 2019

Я ищу способ, учитывая сигнатуру функции, канонизировать ее args и kwargs.То есть любые kwargs, переданные уже в сигнатуре функции, должны быть преобразованы в args.

Например:

def myfunc(a, b=0, c=0, **kwargs):
    pass

def canonicalize(func, *args, **kwargs):
    something = inspect.signature(func)
    # Do something with args/kwargs here
    return new_args, new_kwargs

Пример вывода:

>>> canonicalize(myfunc, 1, 2, g=3)
(1, 2), {'g': 3}
>>> canonicalize(myfunc, 1)
(1,), {}
>>> canonicalize(myfunc, 1, b=2)
(1, 2), {}
>>> canonicalize(myfunc, 1, g=3, b=2)
(1, 2), {'g': 3}
>>> canonicalize(myfunc, 1, g=3, c=2)
(1, 0, 2), {'g': 3}

1 Ответ

3 голосов
/ 29 апреля 2019

Вы можете использовать inspect.signature и его метод bind(...), например:

bound_args = inspect.signature(myfunc).bind(1, g=3, c=2)
# <BoundArguments (a=1, c=2, kwargs={'g': 3})>

Затем получить доступ к тому, что вам нужно, из объекта BoundArgumentsНапример:

bound_args.apply_defaults()
args = bound_args.args
kwargs = bound_args.kwargs
...