Erstelle einen Prozess
Alle Pfade sind relativ zum Repository-Root. Das Paket befindet sich in
process_package/.
Wie die Elternklasse funktioniert
process_package/toy_process/process.py definiert Process:
__init__(**overrides)setztself.params = {**self.set_parameters(), **overrides}, dannself.steps = self.set_steps().set_parameters()undset_steps()sind abstrakt. Eine Kindklasse, der eine der beiden fehlt, kann nicht instanziiert werden.run(context=None)durchläuftself.stepsin der Reihenfolge:- eine
Process-Instanz →step.run(context), verschachtelt, mit dem selben context-Dict - jedes andere Callable →
step(context) - alles andere →
TypeError
- eine
rungibt das context-Dict zurück und gibt eine eingerückte Ablaufverfolgung aus.
Verändere weder toy_process/ noch überschreibe __init__ oder run in einer Kindklasse.
Regeln für die Kindklasse
from toy_process import Processund erbe davon.set_parameters(self)gibt eindictmit Standardwerten zurück. Verwende{}, falls es keine gibt.set_steps(self)gibt einelistzurück. Jedes Element ist entweder:- eine gebundene Methode:
self.count_words, ohne Klammern, oder - eine
Process-Instanz:CleanText(lowercase=self.params["lowercase"]).
- eine gebundene Methode:
- Jede Schrittmethode hat die Signatur
def name(self, context):.- Lese Einstellungen aus
self.params["..."]. - Lese und schreibe Daten in
context["..."]. - Gib nichts zurück. Rückgabewerte werden ignoriert.
- Lese Einstellungen aus
- Definiere eine Unterprozessklasse oberhalb der Klasse, die sie verwendet, oder importiere sie.
Vorlage
"""Einzeilige Beschreibung, was der Prozess macht.
Ausführen von process_package/ aus:
python -m examples.<module_name>
"""
from toy_process import Process
class Unteraufgabe(Process):
def set_parameters(self):
return {"option": True}
def set_steps(self):
return [self.teil_ausfuehren]
def teil_ausfuehren(self, context):
if self.params["option"]:
context["value"] = context["value"] * 2
class Hauptaufgabe(Process):
def set_parameters(self):
return {"start": 1, "option": True}
def set_steps(self):
return [
self.laden,
Unteraufgabe(option=self.params["option"]), # verschachtelter Unterprozess
self.abschliessen,
]
def laden(self, context):
context["value"] = self.params["start"]
def abschliessen(self, context):
context["result"] = f"Wert ist {context['value']}"
if __name__ == "__main__":
print(Hauptaufgabe(start=5).run()["result"])
Zu erstellende Dateien
process_package/examples/<module_name>.py: der Prozess, basierend auf der Vorlage.process_package/tests/test_<module_name>.py: einunittest-Test, der.run()aufruft und auf Schlüssel im zurückgegebenen context prüft. Überprüfe auch, dass das Überschreiben eines Parameters das Ergebnis ändert.
import unittest
from examples.<module_name> import Hauptaufgabe
class HauptaufgabeTests(unittest.TestCase):
def test_run(self):
self.assertEqual(Hauptaufgabe(start=5).run()["result"], "Wert ist 10")
def test_parameter_ueberschreiben(self):
self.assertEqual(Hauptaufgabe(start=5, option=False).run()["result"], "Wert ist 5")
if __name__ == "__main__":
unittest.main()
Überprüfe anschließend mit der Fähigkeit run-process. Ein vollständiges funktionierendes Beispiel ist
process_package/examples/word_report.py.