【发布时间】:2019-05-29 07:33:29
【问题描述】:
А 几小时前我提交了一个related question 并得到了一个答案,为什么我需要将yield 添加到我的装饰器中才能正常运行。
我最近回忆起我省略了它是有原因的 - 我无法解释的奇怪行为。
如果我是盲人,我提前道歉,但我花了几个小时盯着和玩这段代码,这就是我得到的:
def decor(func):
def wrapper(*args, **kwargs):
if 1==2:
print ("Generator")
for item in func(*args, **kwargs):
print(item)
#yield(item)
else:
print ("Not generator")
res = func(*args, **kwargs)
print(res)
return res
return wrapper
@decor
def f():
return "a"
f()
"""
Output:
Not generator
a
"""
如果我删除yield 之前的评论,则根本没有输出。
这是为什么呢?我在if 1==2: 语句中更改的任何内容怎么可能对脚本产生任何影响?
【问题讨论】:
-
Python 中的数字 1 和 2 是浮点数吗?
-
@RobertHarvey 不,它们是很好的旧整数,除非写成 1.0 等等。这里没有浮点问题。
-
您的
wrapper不能既是普通函数又是生成器函数。有条件地将包装器定义为生成器或普通函数并将其返回。函数定义中的 yield anywhere 自动使整个事物成为生成器。这发生在函数定义时 -
@RobertHarvey 当我访问该链接并点击“运行”时,我得到的正是 OP 报告的输出。当我取消注释
yield时,我收到一个错误,这可能是 OP 想要询问的内容。
标签: python python-3.x generator decorator python-decorators