python - 为什么这两个装饰器返回不同的结果?
问题描述
我是 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")
解决方案
因为在使用点:
AddTags("p", "i", "b")(MyWebWelcome)("Drags")
或者
decorator(MyWebWelcome)("Drags")
MyWebWelcome
函数已经用@AddTags("p", "i", "b")
.
@decorator
形式应用于函数声明时间。
因此,第二次和第三次调用将添加另一层相同的装饰(用“p”、“i”、“b”标签包装一个字符串两次)
推荐阅读
- python - 在 forms.py 中排除登录用户
- node.js - 通过 `$push` 以原子方式更新文档的数组字段,该元素的数量等于同一文档中其他字段的值
- qt - QT 文字转语音模块
- node.js - 从 package.json 文件安装依赖项时忽略公共 npm 注册表中不存在的包
- python - 简单脚本不适用于 os.system
- javascript - 在全屏模式下调整图像大小
- angular - 我们如何在角度库中添加全局样式
- github - 从 gradle 实现 'com.airbnb.androidlottie:4.2.2'
- javascript - 使用 openpgp-js 解码 Java Bouncy Castle 编码的 PGP 消息:找不到公钥加密的会话密钥包
- docker - 图片无法启动