@albertalexandrov

Откуда в args декоратора класс?

Всем привет!)

В args (def wrapper(*args, **kwargs)) декоратора откуда-то появился класс (песочница):

import functools


def tokenizer(func):
  @functools.wraps(func)
  def wrapper(*args, **kwargs):
    print(args)  # (<class '__main__.VK'>, {'param1': 'value1', 'param2': 'value2'})
    # откуда в args <class '__main__.VK'>?
    _, params = args
    params.update({'access_token': '1234567890'})
    return func(*args, **kwargs)
  return wrapper


class VKMeta(type):
  def __new__(mcs, name, bases, attrs):
    for attr, method in attrs.items():
      if not attr.startswith('__'):
        attrs[attr] = classmethod(tokenizer(method))
    return super().__new__(mcs, name, bases, attrs)  


class VK(metaclass=VKMeta):
  def get(self, params):
    # тело метода
    return params


print(VK.get({'param1': 'value1', 'param2': 'value2'}))


Почему так происходит? Там же в песочнице есть пример другого декоратора.
  • Вопрос задан
  • 123 просмотра
Пригласить эксперта
Ответы на вопрос 1
@lyrjie
В декорируемом вызове
def get(self, params):
self-- аргумент, инстанс класса VK

Это компенсируется строкой
_, params = args
где инстанс класса присваивается переменной _и больше не используется, а переданные методу параметры присваиваются переменной params
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы