Я применяю декоратор к некоторым функциям, и декоратору потребуются некоторые аргументы в функциях. Тем не менее, я бы присвоил аргументам некоторые значения по умолчанию. Декоратор получает аргументы с помощью *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’]
, независимо от способа вызова функции?
Похоже, он запретил способ № 2 вызова функции. Но я все еще не могу получить доступ к аргументам для #1 и #3 таким же образом.
Я пытался решить эту проблему в одном из своих проектов. И единственный способ, который я нашел, - это использовать самоанализ python.
Вот код:
bound_args = inspect.signature(fn).bind(*in_args, **in_kwargs)
bound_args.apply_defaults()
target_args = dict(bound_args.arguments)
его привязка аргументов дохода функции (независимо от того, идет ли она с ключевыми словами или нет) к определенным именам функции
Это хорошо работает в Python 3. Но в Python 2 кажется, что у проверки нет модуля подписи?
Я не уверен, о чем вы просите, но, может быть, аргументы, содержащие только ключевые слова, помогут решить вашу проблему?
def foo(self, a, b, *, required=...)
Тогда эти аргументы нельзя передавать как позиционные аргументы.