分級管線

已完成

在本單元中,我們將討論如何使用 PyBryt 建置評定提交的分級管線。

輸出格式

視您的意見反應管線而定,PyBryt 的結果可以轉換成各種形式的輸出。 第一種且最明顯的是,每當針對參考檢查學生實作時,PyBryt 會傳回的 pybryt.ReferenceResult 物件。 這些物件可以挑選至檔案以進一步處理,也可以用來搭配 pybryt.generate_report 產生意見反應報告。 最後,如果您想要使用某些後置處理指令碼來自訂報表,可以使用 to_dict 方法將這些參考結果轉換成適用 JSON 的字典格式。

在本機執行

第一種最簡單的方法是在每個提交本機上執行 PyBryt。 在此管道中,講師會收集提交,並將其下載到其電腦上。 然後,他們會使用 PyBryt 從每個提交產生學生實作,並針對參考執行這些實作。 下列指令碼示範此方法:

import glob
import pathlib
import pybryt

student_impls = []
submissions = glob.glob("submissions/*.ipynb")
for subm in submissions:
    student_impls.append(pybryt.StudentImplementation(subm))

refs = []
ref_paths = glob.glob("refs/*.pkl")
for ref_path in ref_paths:
    refs.append(pybryt.ReferenceImplementation.load(ref_path))

for student_impl, subm in zip(student_impls, submissions):
    results = student_impl.run(refs)
    for res in results:
        res_path = f"results/{pathlib.Path(subm).stem}_{res.reference.name}.pkl"
        res.dump(res_path)

上述指令碼會從 submissions 目錄中的提交筆記本產生每個學生實作。 接著它會從 refs 目錄中載入序列化的參考實作、然後針對每個參考執行每個學生實作,並將結果儲存在 results 目錄中以供進一步處理。

若是多次執行,您可能會想要挑選學生實作物件,因為產生物件可能需要一些時間:

for student_impl, subm in zip(student_impls, submissions):
    impl_path = f"student-implementations/{pathlib.Path(subm).stem}.pkl"
    student_impl.dump(impl_path)

然後,您在第一個指令碼中只需要從挑選的學生實作載入,而不是從筆記本產生實作。

您可以在 PyBryt GitHub 存放庫的示範資料夾中找到此樣式的進一步管道範例。

透過自動化執行

PyBryt 也可以透過學生存放庫上的自動化來執行,例如持續整合。 這個方法的優點是,每當學生推送至其存放庫時,可提供學生近乎立即的意見反應,也能讓講師從最新的執行收集學生實作或結果,而不需要重新執行每個提交。

雖然 PyBryt 具有可與 GitHub Actions搭配使用的動作,但您可以在任何 CI 平台上執行 PyBryt。 不論您執行 PyBryt 的方式為何,匯入步驟都會收集結果,並將其放在講師稍後可存取的位置。 在許多內容中,您可以將這些檔案提交至存放庫,以完成此步驟。 然後,若要產生最終的分級,從每個存放庫下載意見反應,然後透過您的分級指令碼執行它。 或者,下載學生實作,並針對另一組參考執行這些實作。