Как правильно получить аргументы ключевого слова по умолчанию для декораторов?

Я применяю декоратор к некоторым функциям, и декоратору потребуются некоторые аргументы в функциях. Тем не менее, я бы присвоил аргументам некоторые значения по умолчанию. Декоратор получает аргументы с помощью *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’], независимо от способа вызова функции?

Я не уверен, о чем вы просите, но, может быть, аргументы, содержащие только ключевые слова, помогут решить вашу проблему? def foo(self, a, b, *, required=...) Тогда эти аргументы нельзя передавать как позиционные аргументы.

a_guest 09.04.2019 06:34

Похоже, он запретил способ № 2 вызова функции. Но я все еще не могу получить доступ к аргументам для #1 и #3 таким же образом.

Awdrtg 10.04.2019 04:26
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
304
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я пытался решить эту проблему в одном из своих проектов. И единственный способ, который я нашел, - это использовать самоанализ 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 кажется, что у проверки нет модуля подписи?

Awdrtg 10.04.2019 04:28
stackoverflow.com/questions/45946051/…
Pavel Kovtun 10.04.2019 10:35

Другие вопросы по теме

Украшенная функция возвращает "Нет"
В nest.js можно ли получить экземпляр службы внутри декоратора параметров?
Как я могу игнорировать декораторы TypeScript (использовать объекты NestJS, как обычные типы)?
Как внедрить зависимость следующего обработчика в цепочке ответственности?
Почему для реализации шаблона декоратора требуется общий абстрактный суперкласс с базовым классом?
Передайте дополнительные аргументы декоратору метода внутри углового компонента
Декораторы машинописного текста - связать декоратор метода с декоратором класса
Обнаружение использования объекта наименее инвазивным и наиболее невидимым способом
Как использовать объект данных в VueJS при использовании декораторов? «Ожидается, что это» будет использоваться методом класса «данные»
Декоратор не добавляет свойство к классу, который он украшает. Как это исправить?