相关疑难解决方法(0)

python生成器"发送"功能的目的?

有人能举例说明为什么与Python生成器函数相关的"发送"功能存在吗?我完全理解屈服函数.但是,发送功能让我很困惑.有关此方法的文档很复杂:

generator.send(value)
Run Code Online (Sandbox Code Playgroud)

恢复执行并将值"发送"到生成器函数中.value参数成为当前yield表达式的结果.send()方法返回生成器产生的下一个值,如果生成器退出而不产生另一个值,则引发StopIteration.

那是什么意思?我认为价值是功能的输入?短语"send()方法返回生成器产生的下一个值"似乎也是yield函数的确切目的; yield返回生成器产生的下一个值...

有人能给我一个利用发送器生成器的例子吗?

python

129
推荐指数
9
解决办法
6万
查看次数

在 Python 中将回调转换为生成器?

假设我们有一些库(例如用于 XML 解析)接受回调并在每次遇到某些事件时调用它(例如找到一些 XML 标记)。我希望能够将这些回调转换为可以通过 for 循环进行迭代的生成器。在不使用线程或收集所有回调结果(即使用延迟评估)的情况下,这在 Python 中是可能的吗?

例子:

# this is how I can produce the items
def callback(item)
    # do something with each item
parser.parse(xml_file, callback=callback)

# this is how the items should be consumed
for item in iter_parse(xml_file):
    print(item)
Run Code Online (Sandbox Code Playgroud)

我试图研究是否可以使用协程,但似乎协程对于从生产者推送数据很有用,而生成器将数据拉到消费者。

自然的想法是生产者和消费者将成为来回 ping 执行流程的协程。

我已经设法让生产者 - 消费者模式与 asyncio 循环一起工作(以类似于这个答案的方式)。但是它不能像 for 循环中的生成器一样使用:

import asyncio

q = asyncio.Queue(maxsize=1)

@asyncio.coroutine
def produce(data):
    for v in data:
        print("Producing:", v)
        yield from q.put(v)
        print("Producer waiting")
    yield from q.put(None) …
Run Code Online (Sandbox Code Playgroud)

python generator callback coroutine

5
推荐指数
0
解决办法
709
查看次数

Python FTP“块”迭代器(无需将整个文件加载到内存中)

关于检索 FTP 文件并将其写入流(例如字符串缓冲区或文件)的堆栈溢出有几个答案,然后可以对其进行迭代。

如:从 FTP python 读取缓冲区中的文件

但是,这些解决方案涉及在开始处理内容之前将整个文件加载到内存中或将其下载到磁盘。

我没有足够的内存来缓冲整个文件,而且我无权访问磁盘。这可以通过处理回调函数中的数据来完成,但我想知道是否有可能将 ftp 代码包装在一些返回迭代器的魔法中,而不是用回调填充我的代码。

IE 而不是:

def get_ftp_data(handle_chunk):
    ...
    ftp.login('uesr', 'password') # authentication required
    ftp.retrbinary('RETR etc', handle_chunk)
    ...

get_ftp_data(do_stuff_to_chunk)
Run Code Online (Sandbox Code Playgroud)

我想要:

for chunk in get_ftp_data():
    do_stuff_to_chunk(chunk)
Run Code Online (Sandbox Code Playgroud)

并且(与现有答案不同)我想在迭代之前不将整个 ftp 文件写入磁盘或内存。

python ftp

4
推荐指数
1
解决办法
1306
查看次数

标签 统计

python ×3

callback ×1

coroutine ×1

ftp ×1

generator ×1