Кто-нибудь знает, что не так с этим кодом?Python decorator on instance method
def paginated_instance_method(default_page_size=25):
def wrap(func):
@functools.wraps(func)
def inner(self, page=1, page_size=default_page_size, *args, **kwargs):
objects = func(self=self, *args, **kwargs)
return _paginate(objects, page, page_size)
return inner
return wrap
class Event(object):
...
@paginated_instance_method
def get_attending_users(self, *args, **kwargs):
return User.objects.filter(pk__in=self.attending_list)
Я получаю следующее сообщение об ошибке:
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/Users/zarathustra/Virtual_Envs/hinge/hinge_services/hinge/api/decorators.py", line 108, in wrap
def inner(self, page=1, page_size=default_page_size, *args, **kwargs):
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/functools.py", line 33, in update_wrapper
setattr(wrapper, attr, getattr(wrapped, attr))
AttributeError: 'Event' object has no attribute '__name__'
Причина, почему я думал, что это будет работать, потому что, путем проб и ошибок, я получил следующий декоратор работает как шарм для методы класса:
def paginated_class_method(default_page_size=25):
def wrap(func):
@functools.wraps(func)
def inner(cls, page=1, page_size=default_page_size, *args, **kwargs):
objects = func(cls=cls, *args, **kwargs)
return _paginate(objects, page, page_size)
return inner
return wrap
Ваш декоратор не имеет смысла. Декоратор должен взять функцию в качестве аргумента, но ваш принимает только один аргумент, который, по-видимому, является числом ('default_page_size'). Вы намеревались украсить чем-то вроде '@paginated_instance_method (10)'? – BrenBarn
@BrenBarn Да, я пытался это сделать. Я новичок в декораторах, но я добавлю пояснение, чтобы объяснить, почему я думал, что это сработает. –
Можете ли вы показать, как вы использовали этот другой декоратор? – BrenBarn