Python ';str#u迭代器';对象不可调用
我在胡闹,这是一个基本上为itertools提供一些语法糖的库 核心类是PipeLine,在其构造函数中传递一个迭代器,当调用迭代器时调用传递的迭代器:Python ';str#u迭代器';对象不可调用,python,python-3.x,iterator,Python,Python 3.x,Iterator,我在胡闹,这是一个基本上为itertools提供一些语法糖的库 核心类是PipeLine,在其构造函数中传递一个迭代器,当调用迭代器时调用传递的迭代器: class PipeLine(object): def __init__(self, coro_func): self.coro_func = coro_func def __iter__(self): return self.coro_func() 正在使用的it示例: >>&
class PipeLine(object):
def __init__(self, coro_func):
self.coro_func = coro_func
def __iter__(self):
return self.coro_func()
正在使用的it示例:
>>> def summer(stdin):
... sum = 0
... for item in stdin:
... sum += item
... yield sum
>>> pipeline = PipeLine(lambda: iter([1, 2, 3, 4])) | PipeLine(summer)
>>> pipeline
<PipeLine: <lambda> | summer>
>>> for item in pipeline:
... print(item)
1
3
6
10
抛出一个错误:
TypeError: 'str_iterator' object is not callable
最后,我尝试:
PipeLine(src.__iter__)
这起作用了
我的问题:为什么“管道(iter(src))不起作用?从我对Python的理解来看,它应该是。我不明白什么
在Linux Mint 12.0上运行CPython 3.2。您没有看到示例函数在
iter
调用周围放置lambda
?管道
需要传递一个创建迭代器的函数,而不是直接创建迭代器对象iter(src)
是一个迭代器,而不是一个函数。从您展示的代码中,很明显,管道
构造函数不采用iterable参数:它需要一个0参数函数。事实上,请看您给出的工作示例:
pipeline = PipeLine(lambda: iter([1, 2, 3, 4]))
^^^^^^
参见lambda
?该示例没有直接传递iter(some_list),而是传递了一个无参数函数,返回迭代器
所以想必
PipeLine(lambda: iter(src))
也可以为您工作。我得到
TypeError:不支持的|操作数类型:'PipeLine'和'PipeLine'
PipeLine(lambda: iter(src))