¿Qué hace Crear un Proceso?
Todas las rutas son relativas a la raíz del repositorio. El paquete está en
process_package/.
Cómo funciona la clase padre
process_package/toy_process/process.py define Process:
__init__(**overrides)estableceself.params = {**self.set_parameters(), **overrides}, luegoself.steps = self.set_steps().set_parameters()yset_steps()son abstractos. Una clase hija que falte a uno de ellos no se puede instanciar.run(context=None)itera sobreself.stepsen orden:- una instancia de
Process→step.run(context), anidado, con el mismo diccionario context - cualquier otro callable →
step(context) - cualquier otra cosa →
TypeError
- una instancia de
rundevuelve el diccionario context e imprime un trace indentado.
No modifiques toy_process/ ni sobrescribas __init__ o run en una clase hija.
Reglas para la clase hija
from toy_process import Processy crear subclase de ella.set_parameters(self)devuelve undictcon valores predeterminados. Usa{}si no hay ninguno.set_steps(self)devuelve unalist. Cada elemento es:- un método enlazado:
self.count_words, sin paréntesis, o - una instancia de Process:
CleanText(lowercase=self.params["lowercase"]).
- un método enlazado:
- Cada método de paso tiene la firma
def nombre(self, context):.- Lee configuraciones de
self.params["..."]. - Lee y escribe datos en
context["..."]. - No devuelve nada. Los valores de retorno se ignoran.
- Lee configuraciones de
- Define una clase de subproceso arriba de la clase que la usa, o impórtala.
Plantilla
"""Descripción de una línea de lo que hace el proceso.
Ejecutar desde process_package/:
python -m examples.<nombre_módulo>
"""
from toy_process import Process
class SubTask(Process):
def set_parameters(self):
return {"option": True}
def set_steps(self):
return [self.do_part]
def do_part(self, context):
if self.params["option"]:
context["value"] = context["value"] * 2
class MainTask(Process):
def set_parameters(self):
return {"start": 1, "option": True}
def set_steps(self):
return [
self.load,
SubTask(option=self.params["option"]), # subproceso anidado
self.finish,
]
def load(self, context):
context["value"] = self.params["start"]
def finish(self, context):
context["result"] = f"value is {context['value']}"
if __name__ == "__main__":
print(MainTask(start=5).run()["result"])
Archivos a crear
process_package/examples/<nombre_módulo>.py: el proceso, a partir de la plantilla.process_package/tests/test_<nombre_módulo>.py: una pruebaunittestque llama a.run()y verifica las claves en el context devuelto. También comprueba que sobrescribir un parámetro cambie el resultado.
import unittest
from examples.<nombre_módulo> import MainTask
class MainTaskTests(unittest.TestCase):
def test_run(self):
self.assertEqual(MainTask(start=5).run()["result"], "value is 10")
def test_parameter_override(self):
self.assertEqual(MainTask(start=5, option=False).run()["result"], "value is 5")
if __name__ == "__main__":
unittest.main()
Luego verifica con la habilidad run-process. Un ejemplo completo y funcional es
process_package/examples/word_report.py.