[英]How to get in prefect core local task final state?
我已經建立了一個流程,如果 kwarg 為空,它會隱式跳過運行給定任務。
我在任務 function 中使用類似的東西來跳過邏輯:
if kwargs.get('processors', Hierarchy()).__len__() == 0:
raise signals.SKIP('skipping task',
result=Prediction())
我想構建一些單元測試以確保跳過所述任務的最終 state。 在任務級別獲得 state 的最簡單方法是什么?
我可以從文檔中看到如何獲得流程而不是任務。
更新
為了補充克里斯的回應,我使用了他提出的第一個選項。 由於我的流程是在測試之外定義的,因此我創建了一個簡單的 function 來獲取一組已跳過的任務。 在測試中,這與應該跳過的任務列表進行了比較:
def get_skipped_tasks(flow_state):
return set(key.name for key, value in flow_state.result.items() if value.is_skipped())
為了完整起見,我將在此處包含幾種方法; 對於我的示例,我將使用這個基本流程:
from prefect import task, Flow
from prefect.engine.signals import SKIP
import random
@task
def random_number():
return random.randint(0, 100)
@task
def is_even(num):
if num % 2:
raise SKIP("odd number")
return True
with Flow("dummy") as flow:
even_task = is_even(random_number)
交互式運行時,您始終可以運行整個流程並從父流程運行 state 訪問各個任務狀態; 請注意,當您“調用”任務(例如is_even(random_number)
)時,會創建一個副本,因此您需要正確跟蹤這些副本。
flow_state = flow.run()
assert flow_state.result[even_task].is_skipped() # for example
交互式運行時,您還可以傳遞運行者將尊重的任務字典 -> state; 可以選擇為這些狀態提供數據:
from prefect.engine.state import Success
mocked_state = Success(result=2)
flow_state = flow.run(task_states={random_number: mocked_state})
assert not flow_state.result[even_task].is_skipped()
最后,如果你想單獨在這個任務上運行基於狀態的測試,你可以使用TaskRunner
。 這變得有點復雜,因為您必須使用Edge
重新創建上游依賴項。
from prefect.engine.task_runner import TaskRunner
from prefect.edge import Edge
runner = TaskRunner(task=even_task)
edge = Edge(key="num", upstream_task=random_number, downstream_task=even_task)
task_state = runner.run(upstream_states={edge: mocked_state})
assert not task_state.is_skipped()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.