Как правильно получить аргументы по умолчанию для ключевых слов для декораторов? - PullRequest
1 голос
/ 09 апреля 2019

Я применяю декоратор для некоторых функций, и декоратору потребуются некоторые аргументы в функциях.Тем не менее, я бы назначил некоторые значения по умолчанию для аргументов.Декоратор получает аргументы с *args, **kwargs.

def decorator(fn):
    def wrapper(*args, **kwargs):
        print(args)
        print(kwargs)
        # do something with the required1 and required2 ...
        return fn(*args, **kwargs)
    return wrapper

class MyClass(object):
    def foo(self, a, b, required1=0, required2='x'):
        pass

Но при вызове функции различными способами оболочка декоратора получит разные аргументы

A = MyClass()
A.foo(1, 2, 3, '4') # 1
A.foo(1, 2) # 2
A.foo(1, 2, required1=3, required2='4') # 3

Выводы будут такими:

#1 
args: [<object at 0x0000>, 1, 2, 3, ‘4’]
kwargs: {}
#2
args: [<object at 0x0000>, 1, 2]
kwargs: {}
#3
args: [<object at 0x0000>, 1, 2]
kwargs: {‘required1’: 3, ‘required2’: ‘4’}

КакЯ должен делать, если я хочу получить доступ к необходимым аргументам, таким как r = kawrgs[‘required1’] независимо от способа вызова функции?

1 Ответ

2 голосов
/ 09 апреля 2019

Я пытался решить эту проблему в одном из моих проектов.И единственный способ, который я нашел, - это использовать самоанализ Python.

Вот код:

bound_args = inspect.signature(fn).bind(*in_args, **in_kwargs)
bound_args.apply_defaults()
target_args = dict(bound_args.arguments)

его обязательные аргументы дохода функции (либо с ключевыми словами, либо нет) дляопределенные имена функций

...