问题标签 [yield-from]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
365 浏览

python-3.x - Python中的'yield'和'yield from'有什么区别?

yield在代码中大量使用基本关键字来构建生成器和协程......

在网上搜索各种yield相关的解决方案时,我也找到了yield from语法。两者都用于生成器。

我不觉得我在这里缺少一个功能,那么fromtweek the basic怎么样yield

0 投票
3 回答
1009 浏览

python - 修改 yield from 的返回值

假设我有这些解析器:

parse_foo并且parse_bar都是一一产生行的生成器。如果我想创建一个调度函数,我会这样做:

yield from 语法让我可以轻松地在生成器上下传输信息。

有没有办法在修改产量结果的同时保持隧道效应?
在打破隧道的同时这样做很容易:

但是这种方式我不能使用.send().throw()一直到解析器。

我想到的唯一方法是做一些丑陋的事情try: ... except Exception: ...并传递异常,同时对.send(). 它丑陋,凌乱且容易出错。

0 投票
2 回答
5023 浏览

php - `yield from $generator` 和 `return $generator` 之间的区别?

我有一个返回生成器的函数。目前它使用yield from

如果我yield from用一个简单的替换它return,在这种情况下会改变什么吗?也许在执行中?还是性能?是否yield from会产生一个新的“外部”迭代器?

我知道,在其他情况下yield from可以更灵活,因为我可以多次使用它,甚至将它与 simple yields 混合使用,但这对我的情况无关紧要。

0 投票
2 回答
1446 浏览

python - python中大文件的并发下载和处理

我有一个要下载的大文件(例如压缩档案)的 URL 列表,我想要处理(例如解压缩档案)。

下载和处理都需要很长时间,并且磁盘 IO 上的处理很重,所以我希望一次只运行一个。由于这两个任务花费大约相同的时间并且不竞争相同的资源,我想在处理最后一个文件时下载下一个文件。

这是生产者-消费者问题的变体。

这种情况类似于读取和处理图像下载大量文件,但我的下载器调用(还)不是可挑选的,所以我无法使用多处理,并且这两个任务大约需要相同的时间。

这是一个虚拟示例,其中下载和处理都是阻塞的:

我怎样才能使这两个任务并发?我可以使用yieldyield from 以一种聪明的方式,也许结合使用deque?还是必须asyncioFuture

0 投票
1 回答
31 浏览

python - 使用 Python3 灵活的 XML 到字典

我收到了一个包含我需要的数据的 XML 文件,我需要将其转换为 CSV。

这应该很简单,但是 XML 的“重复单元”的子节点数并不总是相同的。

我正在努力解决的是如何最好地迭代每个子元素的子元素,直到没有更多子元素,并将其作为一个“行”返回。最终输出应该是一个字典列表(对于 CSV,每个“行”一个列表)。

举个例子

这应该导致:

我一直在使用 xml.etree.ElementTree 和 root.iter,我对循环很满意,但它的活力。

我尝试在这里使用多个嵌套列表的逻辑,但无济于事。有人可以指出我正确的方向并提出一种新方法吗?

我知道最后长度不同的字典对于写出 csv 并不理想,但我可以根据我想要的输出来处理它。

0 投票
1 回答
209 浏览

python - 为什么嵌套“yield from”语句(生成器委托)会产生终止的“无”值?

是否可以嵌套yield from语句?

简单的形式很明显:

产生:

但是如果我有嵌套的生成器呢?

这会产生:

None如果我使用它为什么会产生yield from(即使它是嵌套的)?

我知道我可以做类似的事情:

哪个产生相同的输出而忽略了None(这是我所期望的)。我也可以写一个简单的循环:

但是,我认为使用嵌套委托会更 Pythonic(最好是 even yield from x from yor yield from x for x in y,但这不是正确的语法)。为什么它没有按我的预期工作?

0 投票
2 回答
2465 浏览

python-3.x - 表达式“a = yield from f()”是什么意思?

所以,这是一个python表达式:

这是什么意思?它可以在哪里使用?应该是什么样的对象f?计算表达式后的值a是多少?

stackoverflow上有几个关于python的问题yieldyield from但我没有找到答案。

我理解 和的yield x含义。Even或多或少可以理解。但对我来说是意外的事情。y = yieldy = yield xyield from f()a = yield from f()

更新:

B. Barbieri 提供了正确答案。我仍然需要稍微不同地制定它。

表达式的语义与a = yield from f()函数调用非常相似:返回af()。但是如果f()产生任何东西,产生的值将被转发到“上层”(你只能a = yield from f()在函数内部编写,这将使你成为一个生成器)。如果在那之后“上层”将一个值发送回您的生成器,该值将被转发到f()并且f()将继续。

yield from允许和“f()上层”在您的函数运行时进行通信。

我想现在我确实明白这一切yield from是怎么回事,并希望这种解释对其他人有所帮助。

0 投票
1 回答
75 浏览

python - CPython 是否实现了 PEP 380 中提到的优化?

PEP 380提到yield from expr可以在 Python 中优化语法。

PEP 380 - 优化

当存在一长串生成器时,使用专门的语法为优化提供了可能性。例如,当递归遍历树结构时,可能会出现这种链。向下和向上传递 __next__() 调用和生成值的开销可能导致本应为 O(n) 的操作在最坏的情况下变为 O(n**2)。

一种可能的策略是向生成器对象添加一个槽,以保存被委托的生成器。当在生成器上进行 __next__() or send() 调用时,首先检查此插槽,如果它非空,则恢复它引用的生成器。如果它升起StopIteration,则清除槽并恢复主发电机。

这将减少对不涉及 Python 代码执行的 C 函数调用链的委托开销。一个可能的改进是在一个循环中遍历整个生成器链并直接在最后恢复一个,尽管处理StopIteration更复杂。

CPython 是否实现了这种优化?

0 投票
2 回答
464 浏览

python - simpy 在回调中使用 yield

我正在尝试将回调附加到 SimPy 模拟中的各种事件,我发现您不能yield在回调中使用关键字。有没有办法正确地做到这一点,或者你必须只在回调中使用回调?

例如,我希望该put_and_get_eggs函数在以下代码中工作:

到目前为止,我能够通过将“yield”右侧的每个事件定义get_and_put_eggs为单独的事件并向它们添加回调来实现这一点,但这会创建一个非常长且令人困惑的回调链。我希望能够做类似的事情,yield from但我无法让它工作(例如使用 line put_eggs.callbacks.append(lambda x: (yield from get_and_put_eggs)))。

这可能吗?我检查了以下问题,但在回调场景中似乎有点不同,因为回调仅附加到回调列表中,您不能显式地从中产生。 Python,SimPy:在函数内部使用 yield

0 投票
0 回答
40 浏览

python - 来自 listcomp 或genexpr 差异的收益

为什么结果不一样?