【发布时间】:2016-02-07 22:57:51
【问题描述】:
在大多数用 Python 实现 __iter__ 的代码示例中,我看到它们返回 self 而不是另一个对象。我知道这是迭代器所需的行为,但是对于可迭代的对象,它不应该返回 self 以外的东西吗?
我的推理:(除了 GIL,不受 CPU 限制)
- 如果您有多个线程迭代同一个容器,则在可迭代类中跟踪迭代器进度(通过
__next__方法)将从两个线程中写入值,因此每个循环只会获取部分数据。 - 一旦您的迭代器/可迭代对象被迭代一次,您需要重置它。这可以在
__iter__中轻松完成,但这似乎与我看到其他语言实现迭代器的方式背道而驰。我想它是否是惯用的 Python 并不重要。
我想到的任何示例都是一个名为 Search 的类,它使用 HTTP REST API 来初始化搜索。完成后,您可以做几件事。
- 使
Search对象可迭代,__iter__返回自身。不是线程安全的。 - 让
Search隐含__iter__返回一个不同的对象,该对象跟踪迭代并根据需要从服务器查询结果。是线程安全的。 - 让
results方法返回一个非线程安全的迭代器/可迭代SearchResults对象,但获取它的方法是线程安全的。
总体而言,在惯用的 Python 中实现线程安全的迭代器最稳健的方法是什么。也许我什至应该将 HTTP REST API 抽象为像许多数据库库一样的游标对象(类似于选项 3)。
【问题讨论】:
-
这取决于你想做什么。如果你想在同一数据上同时拥有多个独立的迭代器,那么你不想让迭代器成为它自己的迭代器。
-
您在哪里看到这些示例?由于您给出的原因,让一个对象成为自己的迭代器总是一个坏主意。
标签: python python-3.x iterator