【问题标题】:Why these two decorators return different results?为什么这两个装饰器返回不同的结果?
【发布时间】:2019-12-11 15:20:56
【问题描述】:

我是 python 装饰器的新手。请帮助我。需要第一个输出。我不明白为什么第二个和第三个装饰器两次装饰“p”“i”“b”标签。

def AddTags(*tags):
    def decorator(oldFunc):
        def inside(*args, **kwargs):
            code = oldFunc(*args, **kwargs)
            for tag in reversed(tags):
                code = "<{0}>{1}</{0}>".format(tag, code)
            return code
        return inside
    return decorator

@AddTags("p", "i", "b")
def MyWebWelcome(name):
    return "Welcome "+name+" To my blog!"

MyWebWelcome("Drags")

# Wrong Usage
AddTags("p", "i", "b")(MyWebWelcome)("Drags")

# Wrong
def decorator(oldFunc):
    def inside(*args, **kwargs):
        code = oldFunc(*args, **kwargs)
        for tag in reversed(["p", "i", "b"]):
            code = "<{0}>{1}</{0}>".format(tag, code)
        return code
    return inside


decorator(MyWebWelcome)("Drags")

【问题讨论】:

    标签: python python-3.x python-decorators


    【解决方案1】:

    因为在使用点上:

    AddTags("p", "i", "b")(MyWebWelcome)("Drags")
    

    decorator(MyWebWelcome)("Drags")
    

    MyWebWelcome 函数已经@AddTags("p", "i", "b") 修饰。
    @decorator 表单应用于函数声明时间。
    因此,第 2 次和第 3 次调用将添加另一层相同的装饰(用“p”、“i”、“b”标签包裹字符串两次)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-10
      • 2023-03-22
      • 2015-10-10
      • 2015-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多