在Python 2中向迭代器动态添加属性

时间:2017-10-30 16:49:04

标签: python python-2.7 iterator

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

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

但是我得到的是这个错误,它说iterator属性是只读的:

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)并定义一些自定义属性或方法?

谢谢!

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

1 个答案:

答案 0 :(得分:2)

你做不到。您的示例中的迭代器根本没有放置更多属性的地方;它没有__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

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