首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python:我们真的需要装饰器的包装器吗?(重访)

Python:我们真的需要装饰器的包装器吗?(重访)
EN

Stack Overflow用户
提问于 2019-06-20 03:35:21
回答 1查看 245关注 0票数 0

在阅读了this article之后,我理解了装饰器以及为什么我们使用装饰器而不是子类。在那里,他们编写了以下示例,其中介绍了包装器的需求:

def uppercase_decorator(function):
    def wrapper():
        funct = function()
        make_uppercase = funct.upper()
        return make_uppercase

    return wrapper

然而,我可以这样写“同样的东西”(我希望你会说它不是):

def uppercase_decorator(function): #previously 'function' was called 'message' but 'function' is clearer for comparison. 
    make_uppercase = function().upper
    return make_uppercase

调用salute()时:

@uppercase_decorator
def salute():
    return 'Hi all!'

def decorateIt(fn):
    toUpper = fn().upper  
    return toUpper  

def decorateW(fn):  
    def wrapper():  
        funct = fn()  
        toUpper = funct.upper()  
        return toUpper  
    return wrapper  

import random, string  

@decorateIt  
def sayGarbage():  
    return "".join(random.choice(string.ascii_lowercase) for i in range(6))  

sayGarbage()

为什么会这样呢?

EN

回答 1

Stack Overflow用户

发布于 2019-06-20 03:46:38

让我们看看这里发生了什么:

def uppercase_decorator(message): 
    make_uppercase = func().upper
    return make_uppercase

@uppercase_decorator
def salute():
    return 'Hi all!'

首先,通过在第一个位置参数(message).的位置传入函数

  • saluteuppercase_decorator获取defined.
  • Secondly,salute获取defined.
  • Thirdly,调用salute uppercase_decorator

此时,代码将崩溃,因为调用了func(),而没有在任何地方定义它。如果它在您的Python REPL会话中工作,那么您一定在前面的全局作用域中有一个名字func,所以代码看起来只是巧合地工作。

我们真的需要装饰器的包装器吗?

不是的。可以像你建议的那样,以更好的“闭包”风格编写装饰器,但不是这样。如果您想编写一个不带嵌套函数的装饰器,请尝试使用流行的库decorator.py。它看起来像这样:

from decorator import decorator

@decorator
def uppercase_decorator(func, *args, **kwargs):
    result = func(*args, **kwargs)
    return result.upper()
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56674710

复制
相关文章

相似问题

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