【问题标题】:How to create an iterator pipeline in Python?如何在 Python 中创建迭代器管道?
【发布时间】:2011-09-05 12:34:14
【问题描述】:

是否有在 Python 中创建迭代器管道的库或推荐方法?

例如:

>>>all_items().get("created_by").location().surrounding_cities()

我还希望能够访问迭代器中对象的属性。在上面的例子中,all_items() 返回了一个项目的迭代器,并且这些项目有不同的创建者。

.get("created_by")然后返回项目(即人)的“created_by”属性,然后location()返回每个人的城市,然后将其通过管道传递给surrounding_cities(),它返回所有的迭代器每个位置的周边城市(因此最终结果是周边城市的大列表)。

【问题讨论】:

标签: python iterator pipeline


【解决方案1】:

在您的示例中,您实际上只有两个迭代器方法,all_itemssurrounding_cities,因此您只需使用 itertools.chain 就可以做得很好:

from itertools import chain

cities = chain.from_iterable(
    item.get("created_by").location().surrounding_cities() for item in all_items()
)

cities 将是一个迭代器,列出所有周边城市的项目

【讨论】:

    【解决方案2】:

    我建议你查看如何使用coroutines in python 实现管道,更具体地说是pipe example

    如果你按照上面的例子实现了你的函数,那么你的代码会是这样的(为了简单起见,我想你会想要打印那些城市):

    all_items(get_location(get_creators(get_surrounding_cities(printer()))))
    

    【讨论】:

    • 为什么不all_items(get_creators(get_location(get_surrounding_cities(printer()))))all_itemsget_creators 的行为是否与 get_locationget_surrounding_cities 不同?
    • 其实你是对的,没必要表现得不同,我编辑了我的答案
    【解决方案3】:

    你不只是处理一个迭代器吗?在 Python 中使用迭代器的自然方式是 for 循环:

    for item in all_items():
        item.get("created_by").location().surrounding_cities()
    

    还有其他可能性,例如列表推导,这可能更有意义,具体取决于您正在做什么(如果您尝试生成一个列表作为输出,通常更有意义)。

    【讨论】:

      猜你喜欢
      • 2021-08-29
      • 1970-01-01
      • 2021-04-03
      • 2016-09-23
      • 2020-10-05
      • 1970-01-01
      • 2017-06-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多