Source code for medkit.core.operation
from __future__ import annotations
__all__ = ["Operation", "DocOperation"]
import abc
from typing import List
from medkit.core.document import Document
from medkit.core.id import generate_id
from medkit.core.operation_desc import OperationDescription
from medkit.core.prov_tracer import ProvTracer
[docs]class Operation(abc.ABC):
"""Abstract class for all annotator modules"""
uid: str
_description: OperationDescription = None
_prov_tracer: ProvTracer = None
@abc.abstractmethod
def __init__(self, uid=None, name=None, **kwargs):
"""
Common initialization for all annotators:
* assigning identifier to operation
* storing class name, name and config in description
Parameters
----------
uid:
Operation identifier
name:
Operation name (defaults to class name)
kwargs:
All other arguments of the child init useful to describe the operation
Examples
--------
In the `__init__` function of your annotator, use:
>>> init_args = locals()
>>> init_args.pop('self')
>>> super().__init__(**init_args)
"""
if uid is None:
uid = generate_id()
if name is None:
name = self.__class__.__name__
self.uid = uid
self._description = OperationDescription(
uid=self.uid,
class_name=self.__class__.__name__,
name=name,
config=kwargs,
)
[docs] def set_prov_tracer(self, prov_tracer: ProvTracer):
"""
Enable provenance tracing.
Parameters
----------
prov_tracer:
The provenance tracer used to trace the provenance.
"""
self._prov_tracer = prov_tracer
@property
def description(self) -> OperationDescription:
"""Contains all the operation init parameters."""
return self._description
def check_sanity(self) -> bool:
# TODO: add some checks
pass
[docs]class DocOperation(Operation):
"""
Abstract operation directly executed on text documents.
It uses a list of documents as input for running the operation and creates
annotations that are directly appended to these documents.
"""
@abc.abstractmethod
def run(self, docs: List[Document]) -> None:
raise NotImplementedError