问题标签 [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.
python - 无法从异步函数内部产生并获取产生的数据
我正在尝试从异步函数中的函数中获取。花了几个小时试图解决这个问题并遍历 Stack Overflow 以找到以前回答但无法帮助我找到解决自己问题的类似问题,我发现自己在这里。
很简单,我想使用 Web 浏览器和 Websockets 通过 Panoramisk 查询 Asterisk 管理界面。当用户连接到 websocket 服务器时,它运行 ws_handle 方法
然后我想检索一些数据,然后交付给客户端。我遇到的问题是我发现我不能说
ExtensionStateList.get 函数的位置(大致)如下:
我在另一个与我的 websockets 服务器文件分开的测试文件中使用了同一个文件 ExtensionStateList.py,以非异步方法调用它,如前所示
没有问题,它用函数返回的值填充 exts。
我的研究使我像这样迭代它:
但我不知道如何使用它来填充我希望填充的变量。我试过这样:
只是被告知它不能将 AsyncIO.Future 加入字符串。我也试过换掉return val
a 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 函数,我可以调用它并按以下方式接收日期:
我想我已经掌握了这一点,并且我看到了它们是如何以两种不同的方式来做几乎相同的事情。
感谢您为我指明正确的方向!
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。我不能说我在那里找到了上面代码的确认。
python-3.x - 如何使用 python 生成器递归地生成对象?
我正在编写一个生成器函数,它递归地遍历给定 astroid 节点的所有子节点。
在下面的示例中,node
是一个 astroidfunctiondef
节点。
node.getchildren()
返回节点中包含子节点的生成器。
我的目标是产生包含的每个节点。(即使在子节点中)
在这里,如果我已经注释掉了 yield 语句。对于打印语句,我得到了我想要的结果,但是如果我产生节点,我没有得到想要的输出。
为了重现这个: - 安装 astroid
php - 在引用生成器中使用“yield from”的任何替代方法?
我想使用一些使用Generator
s 作为返回类型和引用的方法。但是,问题是一个方法获取另一个方法的返回值,即按引用返回并且是 a Generator
,并按引用返回它。另外,几乎所有方法在产生一个或多个值后都会返回一个值。
让我们看一个代码:
首先,yield from
出现在我的脑海中。但是,当我尝试使用它时,它给了我以下错误:
这对我来说看起来很奇怪。我不知道为什么它不起作用(在我看来,它应该起作用)。所以,我的问题是:
在这种情况下,为什么
yield from
不能按预期工作并产生错误?它不应该工作吗?有哪些替代解决方案?
谢谢!
php - 如何在 PHP 的生成器中重置产量
我正在尝试建立一个耦合的产量函数。但是当第二次调用该函数时,集成的 yield from 不会重置。
我认为最简单的方法是用一个例子来展示:
代码示例
PHP
预期的?
我希望“Test 2”的输出与“Test 1”相同。但实际上似乎生成器的产量在使用时没有重置。
编辑/重要:
正如@Ganesh Wagh 所指出的那样:在第二个“for-each”中调用生成器非常有效。只有在调用“iterator_to_array”时才会出现问题!这是预期的行为。
我试图在 generatorB 的末尾重置 generatorA,如下所示:
PHP
但无济于事。
问题:这是预期的行为吗?我该怎么做才能重置“内部”生成器?
python - 如何从 Python 中的语法中脱糖?
现在我正在研究 yield-from 和 await 语法之间的区别。从官方 python 文档中,yield-from generator() 只是以下代码的语法糖:
但是我无法在下面的示例中对 yield-from 进行脱糖。
我试图用 for-in 版本替换 yield-from,但它不起作用,因为 for-in 不能放在 tally 变量的右侧。用星号标记的代码的确切脱糖是什么?
python - 是否可以在 Python 中编写任意深度的委托生成器?
我想写一个具有以下接口的类。
这个想法是 Automaton 将定期向调用者产生值,调用者反过来将结果/命令发送回 Automaton。
问题是决策过程“somefunction”将是一些我无法控制的用户定义函数。这意味着我真的不能指望它会yield from
在前面调用 iterate 方法。最糟糕的是,用户可能想要在这个 Automaton 类中插入一些他无法控制的第三方功能。这意味着用户可能无法重写他somefunction
的内容以将其包含yield from
在iterate
调用前。
需要明确的是:我完全理解为什么使用该first
功能会挂起自动机。我只是想知道是否有办法改变iterate
或start
使first
函数工作的定义。
python - 使用 `yield from` 发送到 `zip`ped 生成器
我正在使用 Python 3.6,您可以在其中很好地zip
单独使用一种生成器来获得相同类型的多维生成器。以下面的例子为例,其中get_random_sequence
是一个生成器,它产生一个无限的随机数序列来模拟股票市场上的一个单独的资产。
该生成器可以使用 Python 的zip
函数轻松扩展,并yield from
在具有任意数量资产的模拟市场上生成连续的资产值。
我喜欢这种方法的原因是使用yield from
来避免必须显式构造n 个while True:
资产的元组的循环。
我的问题是:当ped 生成器收到超过的值时,有没有办法以yield from
类似的方式应用?zip
send()
考虑以下生成器,它产生无限序列中连续值的比率。
zip
不幸的是,我能想出的“”这个生成器的最佳方法根本不涉及yield from
......而是while True:
上面提到的丑陋解决方案。
有没有办法做类似的事情,values = yield from zip(*(g.send(v) for g, v in zip(generators, values)))
所以我仍然可以yield from
在zip
没有 的 ped 发电机上使用while True:
?(给定的示例不起作用,因为它不会values
用左侧的 刷新右侧的values
。)
我意识到这更像是一个审美问题。不过还是很高兴知道...
python - 为什么这个递归 ```yield from``` 函数不会引发错误?
下一个(t)返回'b'。我只是对为什么会这样感到困惑,因为如果我们遵循yield from
声明,我们最终yield from prefixes('')
会以返回 None 结束。在我的所有其他测试中,从 None 产生的结果会引发 TypeError。相反,这似乎只是被忽略了,并且 prefixes('b') 移动到下一个 yield 语句(?为什么这样做?)以产生 'b'...关于为什么的任何想法?将不胜感激解释。
python - `yield from` 是否具有 O(1) 时间复杂度?
考虑以下代码片段。
该函数返回几何级数中的第一个,以每次num_elements
开始start
并乘以。multiplier
很容易看出最后一个元素将通过一个 yield-statement 和num_elements-1
yield-from-statements 传递。该函数是否具有O(num_elements)
时间复杂度,或者它是否具有O(num_elements**2)
时间复杂度是由于深度为 0、1、2、...、...、...的嵌套 yield-from-statements 的“阶梯num_elements-2
” num_elements-1
?
编辑:我想出了一个更简单的代码片段来演示我在问什么。
是这个功能O(depth + length of iterable)
,还是它O(depth * length of iterable)
?