首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何不用@语法使用“双层”装饰符?

如何不用@语法使用“双层”装饰符?
EN

Stack Overflow用户
提问于 2018-10-20 18:26:27
回答 1查看 60关注 0票数 2

假设我有个装饰师:

代码语言:javascript
复制
def decorator_with_args(decorator_arg1, decorator_arg2):                
    def decorator(func):
        def wrapped(*args, **kwargs):
            if decorator_arg1 == 'arg1' and decorator_arg2 == 'arg2':
                return func(*args, **kwargs)
        return wrapped
    return decorator

通常,您可以像这样装饰一个函数:

代码语言:javascript
复制
@decorator_with_args('arg1', 'arg2')
def function():
    return 'foo'

>>> foo = function()
'foo'

如何不使用@语法来调用它?

我知道,如果它只是一个单层的装饰器(即没有args的装饰器),您可以这样称呼它:您实际上是将它封装在装饰器函数中,如下所示:

代码语言:javascript
复制
>>> foo = decorator(function)
'foo'

注意,function没有被调用。如果装饰器和函数都有需要传递的参数,这将如何工作?

代码语言:javascript
复制
>>> foo = decorator_with_args(decorator(wrapped_function))

但是,装饰器的*args**kwargs以及最初的函数到哪里去了呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-20 18:37:01

decorator_with_args()是一个装饰工厂--也就是说,一个返回装饰器的函数。这意味着为了在不使用@语法的情况下使用它,需要使用它的参数调用它,然后使用函数作为参数调用结果。

这是怎么看的:

代码语言:javascript
复制
def function():
    return 'foo'

function = decorator_with_args('arg1', 'arg2')(function)

代码语言:javascript
复制
>>> function()
'foo'

请注意,这类似于使用带有或不使用@语法的常规装饰器之间的区别:

代码语言:javascript
复制
@deco
def func(arg):
    # ...

就是

代码语言:javascript
复制
def func(arg):
    # ...

func = deco(func)

作为

代码语言:javascript
复制
@deco_fac(x, y)
def func(arg):
    # ...

就是

代码语言:javascript
复制
def func(arg):
    # ...

func = deco_fac(x, y)(func)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52908813

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档