【问题标题】:Is it possible to loop over a prefect.Parameter?是否可以遍历 prefect.Parameter?
【发布时间】:2020-10-01 23:43:10
【问题描述】:

我有以下flow

with Flow("My flow") as flow:
    urls = Parameter("urls", default=['url1', 'url2'])
    for url in urls:
        result = get_url(urls)

当我通过flow.run() 运行它时,我收到以下错误:

TypeError: 'Parameter' object is not iterable

是否可以迭代它,如果可以,如何迭代?

【问题讨论】:

    标签: python python-3.x etl prefect


    【解决方案1】:

    对于不熟悉延迟计算范式的人来说,这是一个非常常见的绊脚石。

    Prefect Parameters(更一般地说,任何 Prefect 任务)代表将在将来运行的工作单元。构建流程时,您指定稍后运行的工作单元之间的依赖关系。这是一个强大的抽象,因为它可以让您在运行工作流之前推理出工作流的某些属性。

    需要注意的是,您需要区分构建时间(在运行流程之前)可用的内容和运行时可用的内容(在流运行的上下文)。在您的情况下,您正在使用 Prefect 无法知道您的 Parameter 将返回可迭代的东西的知识。此外,即使 Prefect 可以推断出参数输出是可迭代的,它也无法知道将返回多少元素(这可能会随着流程的每次运行而有所不同!)。

    鉴于所有这些,Prefect 使用称为“映射”的概念处理这些“延迟迭代”:https://docs.prefect.io/core/concepts/mapping.html

    在您的情况下,您可以将代码重构为:

    with Flow("My flow") as flow:
        urls = Parameter("urls", default=['url1', 'url2'])
        result = get_url.map(urls)
    

    将为参数返回值中的每个值动态生成get_url 的副本。

    【讨论】:

    • 感谢您的详细解释。它“非常”清晰:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-27
    • 2011-06-14
    • 2015-03-10
    • 2014-12-28
    • 2017-02-09
    • 2023-01-27
    • 1970-01-01
    相关资源
    最近更新 更多