问题描述
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
(通常是 any Prefect任务)代表将来将运行的工作单元。在构建流时,您要指定稍后将运行的工作单元之间的依赖关系。这是一个功能强大的抽象,因为它使您可以在运行工作流之前先对其工作流的某些属性进行推理。
需要注意的是,您需要区分在构建时可用(在运行Flow之前)和在运行时可用(在运行期间)。流运行的上下文)。在您的情况下,您正在使用一些知识,即Prefect无法知道哪个参数将返回可迭代的值。而且,即使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
的副本。