【问题标题】:Should my iterable objects in Python also be the iterator like most examples我在 Python 中的可迭代对象是否也应该像大多数示例一样是迭代器
【发布时间】: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


【解决方案1】:

__iter__ 协议需要返回一个迭代器——它可以是同一个对象(self,而self 需要有一个__next__ 方法),也可以是另一个对象(另一个对象将有__iter____next__)。

在几乎所有重要的用例中,应该为迭代器返回一个不同的专用对象,因为它使整个过程更简单、更容易推理、更可能是线程安全的等。

【讨论】:

    猜你喜欢
    • 2016-04-09
    • 2018-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-14
    • 2011-05-17
    • 2010-09-17
    • 2020-04-23
    相关资源
    最近更新 更多