我正在弄乱pyxshell,这是一个基本上为itertools提供一些语法糖的库。
核心类是PipeLine,它在构造函数中传递一个迭代器,并在调用迭代器时调用传递的迭代器:
class PipeLine(object):
def __init__(self, coro_func):
self.coro_func = coro_func
def __iter__(self):
return self.coro_func()
使用它的一个例子:
>>> 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
所以,我想在字符串中的字符序列上构造一个PipeLine。 Python中的字符串本质上是可迭代的,所以我认为它没有问题。但我期望的工作却没有。这样:
PipeLine(iter(src))
抛出错误:
TypeError: 'str_iterator' object is not callable
最后,我试过了:
PipeLine(src.__iter__)
并且有效。
我的问题:为什么“PipeLine(iter(src))”不起作用?根据我对Python的理解,它应该。我不理解的是什么?
在Linux Mint 12.0上运行CPython 3.2。
答案 0 :(得分:4)
您是否看到lambda
呼叫周围放置iter
的示例函数? PipeLine
需要传递一个创建迭代器的函数,而不是直接创建迭代器对象。 iter(src)
是迭代器,而不是函数。
答案 1 :(得分:4)
从您展示的代码中,很明显Pipeline
构造函数不采用可迭代参数:它需要一个0参数函数。实际上,看看你给出的工作实例:
pipeline = PipeLine(lambda: iter([1, 2, 3, 4]))
^^^^^^
请参阅lambda
?该示例未直接传递iter(some_list)
,它传递了一个返回迭代器的无参数函数。
所以大概是
PipeLine(lambda: iter(src))
也适合你。