1

次のように定義された 2 つのデコレータがあり、どちらもまったく同じことを行います。

# ONLY WORKS FOR CLASSMETHODS
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


# ONLY WORKS FOR INSTANCEMETHODS
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

2 つある理由は、クラス メソッドの場合は最初の引数を cls=cls として渡す必要があり、インスタンス メソッドの場合は self=self で渡す必要があるためです。しかし、これは明らかに理想的ではありません。インスタンスメソッドとクラスメソッドで機能するデコレータを構築する方法を知っている人はいますか?

4

1 に答える 1

3

clsorselfを最初の位置引数として渡すだけです。キーワード引数として渡す必要はありません

def paginated_class_method(default_page_size=25):
    def wrap(func):
        @functools.wraps(func)
        def inner(self_or_cls, page=1, page_size=default_page_size, *args, **kwargs):
            objects = func(self_or_cls, *args, **kwargs)
            return _paginate(objects, page, page_size)
        return inner
    return wrap
于 2013-02-28T15:41:35.770 に答える