我正在尝试添加一个迭代器,一些自定义属性,如:
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
)并定义一些自定义属性或方法?
谢谢!
信息:我认为,由于这个问题的论点,可能值得在另一个线程中询问而不是将信息混合到另一个线程中。
答案 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
虽然我怀疑在迭代器上添加额外的属性是否真的是提供对这些数据的访问的最佳方式。