【发布时间】:2021-02-06 09:14:37
【问题描述】:
[Python 3.8 |蜘蛛]
我试图引入一个简单的定义,它可以将数字按顺序排列为return [1,2,3] 或yield。
最低工作代码如下:
def example(condition):
if condition:
yield 1
yield 2
yield 3
else:
return [1,2,3]
如果有人尝试使用def,它总是会返回一个生成器。即使 return 在 if/else 对中首先出现:
def example(condition):
if not condition:
return [1,2,3]
else:
yield 1
yield 2
yield 3
即使condition = False,python 似乎也没有忽略收益率的存在。
这是一种意外行为。
【问题讨论】:
-
如果函数中存在任何
yield,它将成为一个生成器。它不需要被“击中”。 -
但这残酷地限制了它。这意味着 if/else 根本不被尊重,如果不被尊重,是否至少不构成安全漏洞?
-
@David:我不确定您是如何实现这一飞跃的(针对安全漏洞)-备用分支中的代码没有以任何方式执行,只是编译阶段使用了它决定函数是生成器。这种行为是众所周知的。从任何代码路径产生的函数是生成器。如果您返回某些内容,我认为实际上会导致
StopIteration异常,并将返回值作为值。 -
安全性飞跃是我担心编译过程会考虑 if/else 对中的任何内容,而不关心将要执行的部分是否是 if 或 else 中的内容。与此同时,我找到了临时的、极其悲伤的解决方案:
-
为什么你需要它这样做顺便说一句?如果您不想将其用作生成器,您就不能直接说
list(example())吗?
标签: python if-statement return yield python-3.8