【问题标题】:'str_iterator' object is not callable“str_iterator”对象不可调用
【发布时间】:2013-12-03 05:05:47
【问题描述】:

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

【问题讨论】:

  • 我收到TypeError: unsupported operand type(s) for |: 'PipeLine' and 'PipeLine'

标签: python python-3.x iterator


【解决方案1】:

您没有看到在iter 调用周围放置lambda 的示例函数吗? PipeLine 需要传递一个创建迭代器的函数,而不是直接创建迭代器对象。 iter(src) 是一个迭代器,而不是一个函数。

【讨论】:

    【解决方案2】:

    从您展示的代码中,很明显Pipeline 构造函数确实采用可迭代参数:它需要一个 0 参数函数。确实,看看你给出的工作示例:

    pipeline = PipeLine(lambda: iter([1, 2, 3, 4]))
                        ^^^^^^
    

    看到lambda了吗?该示例没有直接传递iter(some_list),而是传递了一个返回迭代器的无参数函数。

    大概是这样

    PipeLine(lambda: iter(src))
    

    对你也有用。

    【讨论】:

      猜你喜欢
      • 2019-09-29
      • 2021-08-21
      • 2018-09-30
      • 2021-02-18
      • 1970-01-01
      • 2016-10-01
      • 2015-01-29
      • 2014-03-17
      • 2017-06-14
      相关资源
      最近更新 更多