首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在python上使用dict作为装饰器

在python上使用dict作为装饰器
EN

Stack Overflow用户
提问于 2018-11-21 19:40:00
回答 1查看 122关注 0票数 0

是否可以使用默认的“@”语法在python上使用作为装饰器?

比如:

代码语言:javascript
复制
from functools import wraps
def deco(f):
    @wraps(f)
    def wrapper(*args, **kwargs):
        print("WRAPPER")
        return f(*args, **kwargs)
    return wrapper

X={ "deco": deco }

# Working
@deco
def f():
    pass

# Not Working: SyntaxError: invalid syntax
@X["deco"]
def y():
    pass

f()
y()

如果更改为在dict上使用get(),这是可行的,但是这样的操作不会:

代码语言:javascript
复制
# Not working: SyntaxError: invalid syntax
@X.get("deco").require(http_exception=403)
def y():
    pass

这种语法工作有某种方式或/为什么不起作用?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-21 19:52:09

语法受到有意限制。请参阅佩普-0318

修饰器语句在它可以接受的内容上是有限的--任意表达式将无法工作。Guido更喜欢这样做,因为它是一个肠感觉。 当前语法还允许装饰器声明调用返回装饰器的函数:

发送电子邮件给PEP链接说:

我对这件事有直觉。我不知道它是从哪里来的,但我有。可能我希望编译器能够识别某些修饰器。 因此,尽管将来将语法更改为@test很容易,但我想坚持使用更受限制的形式,除非提供了一个真正的用例,允许@test将提高可读性。(@foo().bar()不算,因为我不认为您会需要这个)。

因此,该语言的创建者/主要贡献者决定,允许任何表达式充当修饰器将导致难以阅读代码。

这也是不必要的。你总能做到

代码语言:javascript
复制
my_deco = X.get("deco").require(http_exception=403)
@my_deco
def somefunc():
    ...
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53419421

复制
相关文章

相似问题

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