class Dirty: def __init__(self, initial_value): self.initial_value = initial_value self.value = initial_value def is_clean(self): return self.initial_value == self.value def is_dirty(self): return not self.is_clean() def __bool__(self): return self.is_dirty() class DirtyDelta(Dirty): @property def delta(self): if self.initial_value is None: initial_value = 0 else: initial_value = self.initial_value if self.value is None: value = 0 else: value = self.value return abs(value - initial_value) def delta_string(self): if self.delta > 0: return f"+{self.delta}" return self.delta