没有争论装饰者装饰者?

2024-04-26 10:09:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我写了一个看起来像这样的装饰师

def login_required_message(*args, **kwargs):
    kwargs.setdefault('message', "You must be logged in to do that.")
    return _user_passes_test_message(lambda u: u.is_authenticated(), *args, **kwargs)

但是当我试图在结尾没有()的情况下使用它,它就会失败,除非我这样重写它:

^{pr2}$

那么()是可选的。那么,如何将这个“可选”功能封装到一个decorator中,这样我就可以装饰我的decorator而不允许参数呢?在


Tags: toinyoumessagedefrequiredargslogin
1条回答
网友
1楼 · 发布于 2024-04-26 10:09:57

我最近写了一篇关于这方面的文章,至少,我认为它解决了你想做的事情。对于子孙后代,我想到的是:

def opt_arguments(func):
    def meta_wrapper(*args, **kwargs):
        if len(args) == 1 and callable(args[0]):
            return func(args[0])
        else:
            def meta_func(inner_func):
                return func(inner_func, *args, **kwargs)
            return meta_func
    return meta_wrapper

顺便说一句,在想办法解决这个问题的过程中,我得出了一个结论:这是一件几乎总是比必要的复杂得多的事情;—)

相关问题 更多 >