我有以下流程:
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
是否可以迭代它,如果是,如何?
我有以下流程:
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
是否可以迭代它,如果是,如何?
对于不熟悉延迟计算范式的人来说,这是一个非常常见的绊脚石。
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
这将为参数返回值中的每个值动态生成副本。