#!/usr/bin/env python import traceback from typing import Optional from string import Template class ParameterMismatchError(Exception): pass class ModusMismatchError(Exception): pass def fill(s: str, modus: Optional[str]=None, **kwargs: dict[str, str]) -> str: if modus is not None: dummy = s.format(modus=modus) if dummy == s: # no change! raise ModusMismatchError('modus (%s) given, but not replaced!'%(modus)) s = dummy t = Template(s) if t.get_identifiers() != list(kwargs.keys()): raise ParameterMismatchError('template wants %s, but function call has %s'%( t.get_identifiers(), list(kwargs.keys()))) return t.substitute(**kwargs) def run(s: str) -> None: # versucht einige Ersetzungen fängt gibt eventuelle Fehler aus try: print(fill(s)) except Exception as e: traceback.print_exc() try: print(fill(s, 'BLA')) except Exception as e: traceback.print_exc() try: print(fill(s, 'BLA', a=1, b=2)) except Exception as e: traceback.print_exc() ### oder kurze Fehlerausgaben anstelle von traceback.print_exc(): # except ParameterMismatchError as e: # print('%s: %s'%(e.__class__.__name__, str(e))) # except ModusMismatchError as e: # print('%s: %s'%(e.__class__.__name__, str(e))) if __name__ == '__main__': run('eins:MODUS:zwei') run('eins:{modus}:zwei $a $b')