【发布时间】: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