【发布时间】:2017-10-11 14:57:42
【问题描述】:
假设您使用包装对象:
class IterOrNotIter:
def __init__(self):
self.f = open('/tmp/toto.txt')
def __getattr__(self, item):
try:
return self.__getattribute__(item)
except AttributeError:
return self.f.__getattribute__(item)
这个对象实现了__iter__,因为它将对它的任何调用传递给实现它的成员f。举个例子:
>>> x = IterOrNotIter()
>>> x.__iter__().__next__()
'Whatever was in /tmp/toto.txt\n'
根据文档 (https://docs.python.org/3/library/stdtypes.html#iterator-types),IterOrNotIter 因此应该是可迭代的。
但是,Python 解释器无法将 IterOrNotIter 对象识别为实际上是可迭代的:
>>> x = IterOrNotIter()
>>> for l in x:
... print(l)
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'IterOrNotIter' object is not iterable
虽然这有效:
>>> x = IterOrNotIter()
>>> for l in x.f:
... print(l)
...
Whatever was in /tmp/toto.txt
我不明白为什么。
【问题讨论】:
标签: python python-3.x iterable