2

我有以下流程

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

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

4

1 回答 1

3

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

Prefect Parameter(更一般地说,任何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这将为参数返回值中的每个值动态生成副本。

于 2020-10-01T15:43:10.577 回答