【问题标题】:Dynamically add properties to iterator in Python 2在 Python 2 中为迭代器动态添加属性
【发布时间】:2018-04-11 17:38:51
【问题描述】:

我正在尝试向迭代器中添加一些自定义属性,例如:

iterator = iter([1, 2, 3, 4, 5, 6, 7, 8, 9, 0])
iterator.__custom_property__ = 'random value'

但我得到的只是这个错误,表明迭代器属性是只读的:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'listiterator' object has no attribute '__custom_property__'

这个问题与另一个问题相关联:Get length of a (non infinite) iterator inside it's loop using Python 2.7

我的想法是这样的:如果我能以某种方式将一些自定义数据添加到 itertools.imap 返回给我的迭代器对象中,我就可以在遍历迭代器的任何循环中访问这些信息。

但是,显然,这些数据无法存储。

至少使用这个工作流程。

有谁知道如何“破解”迭代器对象(特别是 listiterator)并定义一些自定义属性或方法?

谢谢!

INFO:我认为,由于这个问题的论点,值得在另一个线程中提问,而不是在另一个线程中混合信息。

【问题讨论】:

  • 这里的用例是什么?如果您尝试从迭代器外部分配某些内容,那么您已经知道它是什么,所以无论如何都可以访问它......所以,有点困惑这里的用途是什么?我的意思是 - 如果你真的想要,为什么你不能编写你自己的类,它的行为就像一个迭代器,但在上面提供你想要的东西?
  • 基本上我有一个数据库查询可以给我一些信息。这些信息通过迭代器(我无法更改)进行处理,并且函数返回此迭代器。我要做的是获取从查询返回的行数,但我需要将此信息放入迭代此迭代器的 for 循环中。而且我认为如果我能以某种方式将这些信息存储到迭代器对象中,我最终可以拥有一个知道它自己的大小的迭代器。
  • 我也很困惑。 Python 中对象的所有属性都是可公开访问的。您是否正在尝试创建一种方便的方法来访问一些深度嵌套的属性?
  • @AndreaRastelli 一个有保证的方法是使用 list(some_iterable) 然后取其长度...取决于您使用的数据库/库的工作方式 - 它可能不知道结果长度是多少流式传输数据或在页面中返回数据,只有在没有更多数据的情况下才知道何时完成......(你必须先用尽它或先找到长度......)
  • @JonClements 我认为一些自定义信息可以存储在迭代器中,以便在我的应用程序流中传递。在这个特定的用例中,我只是想一起使用最好的迭代器(所以不需要循环遍历我拥有的对象的所有元素)和最好的 db(结果查询的大小)。跨度>

标签: python python-2.7 iterator


【解决方案1】:

你不能。您示例中的迭代器根本没有任何地方可以放置更多属性;它没有__dict__。你可以做的最接近的是将它包装在另一个支持额外属性的迭代器中:

class ProxyIter(object):
    def __init__(self, wrapped):
        self.wrapped = wrapped
    def __iter__(self):
        return self
    def __next__(self):
        return next(self.wrapped)
    next = __next__

iterator = ProxyIter(iter([1, 2, 3, 4, 5, 6, 7, 8, 9, 0]))
iterator.foo = 3

虽然我会质疑在迭代器上添加额外属性是否真的是提供对这些数据的访问的最佳方式。

【讨论】:

  • 好吧,正如我所说,我必须访问我的迭代器迭代到的查询的大小。我可以很容易地获得这些信息,但我需要将这些信息存储在某个地方,以便在迭代迭代器信息的 for 循环中轻松访问。而且因为我正在处理的迭代器总是一个非无限的,我认为让一个迭代器知道它的大小可能很有用。但显然我需要创建某种包装器来做到这一点..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-18
  • 1970-01-01
  • 1970-01-01
  • 2014-03-02
  • 1970-01-01
  • 2022-09-27
  • 1970-01-01
相关资源
最近更新 更多