问题标签 [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 投票
2 回答
873 浏览

python - 无法从异步函数内部产生并获取产生的数据

我正在尝试从异步函数中的函数中获取。花了几个小时试图解决这个问题并遍历 Stack Overflow 以找到以前回答但无法帮助我找到解决自己问题的类似问题,我发现自己在这里。

很简单,我想使用 Web 浏览器和 Websockets 通过 Panoramisk 查询 Asterisk 管理界面。当用户连接到 websocket 服务器时,它运行 ws_handle 方法

然后我想检索一些数据,然后交付给客户端。我遇到的问题是我发现我不能说

ExtensionStateList.get 函数的位置(大致)如下:

我在另一个与我的 websockets 服务器文件分开的测试文件中使用了同一个文件 ExtensionStateList.py,以非异步方法调用它,如前所示

没有问题,它用函数返回的值填充 exts。

我的研究使我像这样迭代它:

但我不知道如何使用它来填充我希望填充的变量。我试过这样:

只是被告知它不能将 AsyncIO.Future 加入字符串。我也试过换掉return vala yield val,再次没有运气。

显然,对我来说,这是我缺乏 Python 知识的一个缺点。我能做些什么?我在想也许我可以将 ExtensionStateList.get 更改为异步,但这会让我回到我现在所处的同一条船上?

此外

我继续翻遍 StackOverflow,发现了以下问题:

@types.coroutine 和 @asyncio.coroutine 装饰器有什么区别?

在我看来,也许如果我@asyncio.coroutine在上面的行中添加ws_handle,如下所示:

然后我将能够:

但是,我发现这不起作用,它告诉我不能从异步函数内部产生。我是否误解了我在这里阅读的内容?或者我可能没有正确实施它?我在正确的轨道上吗?

根据此处给出的答案:

'yield from' 异步函数 Python 3.6.5 aiohttp

我也尝试过像这样等待函数:

但是,Python 告诉我对象生成器不能用于 await 表达式。

此外

对于那些可能感兴趣的人,这就是我调用 ws_handle 函数的方式。在创建websocket服务器时调用,websocket服务器负责调度/调用?ws_handle 函数。

在我看来,它为每个连接的客户端调用一次此函数,并且此函数运行直到用户断开连接。

附录

是的,我再次添加更多。我修改了我的 ExtensionStateList.py,以便在调用 get 方法时,它按以下方式执行:

我现在可以yield from在 getInternal 函数中使用 internal ,这以前是我的 get 函数,我可以调用它并按以下方式接收日期:

我想我已经掌握了这一点,并且我看到了它们是如何以两种不同的方式来做几乎相同的事情。

感谢您为我指明正确的方向!

0 投票
0 回答
72 浏览

debian - 为什么'yield from'需要一个封闭的'while 1'?

我试图了解如何使用“收益”。为此,我编写了一个简单(相当无用)的示例(count_vowels.py),运行时会在下面生成:

请解释为什么 proxy2 函数(委托生成器)中需要“while True”?

没有'while True':

我不明白为什么需要'while True'。我知道没有其他方法可以修改示例以使其工作。

count_vowels.py

使用 Python3.5.3,Debian GNU/Linux 9.8(拉伸)

更新:Windows7,Python 3.7.2,同样的结果。

更新:05/04 p.send(None) 在 proxy2 中没有“while True”会引发 StopIteration。我修改了proxy2:

同样,我没有看到任何解释,但它有效。

更新 04/05

我一直在试验和研究文档。下面(恕我直言)是我看起来正确的代码。我从 proxy2 中删除了多余的“收益”。

我一直在研究 PEP 380。我不能说我在那里找到了上面代码的确认。

0 投票
2 回答
341 浏览

python-3.x - 如何使用 python 生成器递归地生成对象?

我正在编写一个生成器函数,它递归地遍历给定 astroid 节点的所有子节点。

在下面的示例中,node是一个 astroidfunctiondef节点。 node.getchildren()返回节点中包含子节点的生成器。

我的目标是产生包含的每个节点。(即使在子节点中)

在这里,如果我已经注释掉了 yield 语句。对于打印语句,我得到了我想要的结果,但是如果我产生节点,我没有得到想要的输出。

为了重现这个: - 安装 astroid

0 投票
1 回答
159 浏览

php - 在引用生成器中使用“yield from”的任何替代方法?

我想使用一些使用Generators 作为返回类型和引用的方法。但是,问题是一个方法获取另一个方法的返回值,即按引用返回并且是 a Generator,并按引用返回它。另外,几乎所有方法在产生一个或多个值后都会返回一个值。

让我们看一个代码:

首先,yield from出现在我的脑海中。但是,当我尝试使用它时,它给了我以下错误:

这对我来说看起来很奇怪。我不知道为什么它不起作用(在我看来,它应该起作用)。所以,我的问题是:

  1. 在这种情况下,为什么yield from不能按预期工作并产生错误?它不应该工作吗?

  2. 有哪些替代解决方案?

谢谢!

0 投票
1 回答
694 浏览

php - 如何在 PHP 的生成器中重置产量

我正在尝试建立一个耦合的产量函数。但是当第二次调用该函数时,集成的 yield from 不会重置

我认为最简单的方法是用一个例子来展示:

代码示例

PHP

预期的?

我希望“Test 2”的输出与“Test 1”相同。但实际上似乎生成器的产量在使用时没有重置。

编辑/重要:

正如@Ganesh Wagh 所指出的那样:在第二个“for-each”中调用生成器非常有效。只有在调用“iterator_to_array”时才会出现问题!这是预期的行为。

我试图在 generatorB 的末尾重置 generatorA,如下所示:

PHP

但无济于事。

问题:这是预期的行为吗?我该怎么做才能重置“内部”生成器?

0 投票
2 回答
177 浏览

python - 如何从 Python 中的语法中脱糖?

现在我正在研究 yield-from 和 await 语法之间的区别。从官方 python 文档中,yield-from generator() 只是以下代码的语法糖:

但是我无法在下面的示例中对 yield-from 进行脱糖。

我试图用 for-in 版本替换 yield-from,但它不起作用,因为 for-in 不能放在 tally 变量的右侧。用星号标记的代码的确切脱糖是什么?

0 投票
0 回答
39 浏览

python - 是否可以在 Python 中编写任意深度的委托生成器?

我想写一个具有以下接口的类。

这个想法是 Automaton 将定期向调用者产生值,调用者反过来将结果/命令发送回 Automaton。

问题是决策过程“somefunction”将是一些我无法控制的用户定义函数。这意味着我真的不能指望它会yield from在前面调用 iterate 方法。最糟糕的是,用户可能想要在这个 Automaton 类中插入一些他无法控制的第三方功能。这意味着用户可能无法重写他somefunction的内容以将其包含yield fromiterate调用前。

需要明确的是:我完全理解为什么使用该first功能会挂起自动机。我只是想知道是否有办法改变iteratestart使first函数工作的定义。

0 投票
0 回答
109 浏览

python - 使用 `yield from` 发送到 `zip`ped 生成器

我正在使用 Python 3.6,您可以在其中很好地zip单独使用一种生成器来获得相同类型的多维生成器。以下面的例子为例,其中get_random_sequence是一个生成器,它产生一个无限的随机数序列来模拟股票市场上的一个单独的资产。

该生成器可以使用 Python 的zip函数轻松扩展,并yield from在具有任意数量资产的模拟市场上生成连续的资产值。

我喜欢这种方法的原因是使用yield from来避免必须显式构造n 个while True:资产的元组的循环。

我的问题是:当ped 生成器收到超过的值时,有没有办法以yield from类似的方式应用?zipsend()

考虑以下生成器,它产生无限序列中连续值的比率。

zip不幸的是,我能想出的“”这个生成器的最佳方法根本不涉及yield from......而是while True:上面提到的丑陋解决方案。

有没有办法做类似的事情,values = yield from zip(*(g.send(v) for g, v in zip(generators, values)))所以我仍然可以yield fromzip没有 的 ped 发电机上使用while True:?(给定的示例不起作用,因为它不会values用左侧的 刷新右侧的values。)

我意识到这更像是一个审美问题。不过还是很高兴知道...

0 投票
2 回答
94 浏览

python - 为什么这个递归 ```yield from``` 函数不会引发错误?

下一个(t)返回'b'。我只是对为什么会这样感到困惑,因为如果我们遵循yield from声明,我们最终yield from prefixes('')会以返回 None 结束。在我的所有其他测试中,从 None 产生的结果会引发 TypeError。相反,这似乎只是被忽略了,并且 prefixes('b') 移动到下一个 yield 语句(?为什么这样做?)以产生 'b'...关于为什么的任何想法?将不胜感激解释。

0 投票
2 回答
132 浏览

python - `yield from` 是否具有 O(1) 时间复杂度?

考虑以下代码片段。

该函数返回几何级数中的第一个,以每次num_elements开始start并乘以。multiplier很容易看出最后一个元素将通过一个 yield-statement 和num_elements-1yield-from-statements 传递。该函数是否具有O(num_elements)时间复杂度,或者它是否具有O(num_elements**2)时间复杂度是由于深度为 0、1、2、...、...、...的嵌套 yield-from-statements 的“阶梯num_elements-2num_elements-1


编辑:我想出了一个更简单的代码片段来演示我在问什么。

是这个功能O(depth + length of iterable),还是它O(depth * length of iterable)