'str_iterator'对象不可调用

时间:2013-12-03 05:05:48

标签: python python-3.x iterator

我正在弄乱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。

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))

也适合你。