import codecs class CodecsSearcher: ''' Base CodecsSearcher ''' def __init__(self): self._registry = {} def __call__(self, encoding): """ leaves the same behavior for `codecs.lookup(encoding)` """ return self.lookup(encoding) def lookup(self, encoding): return self._registry.get(encoding, None) def get_available_codec_names(self): return self._registry.keys() class MyCodecsSearcher(CodecsSearcher): ''' Simple implementation of CodecsSearcher ''' def __init__(self): super(MyCodecsSearcher, self).__init__() self._registry = {'foobar': codecs.lookup('utf-8')} Searcher = MyCodecsSearcher() codecs.register(Searcher) assert isinstance(Searcher, CodecsSearcher) is True assert isinstance(codecs.lookup('foobar'), codecs.CodecInfo) is True assert ('foobar' in Searcher.get_available_codec_names()) is True class MyLazyCodecsSearcher(CodecsSearcher): ''' More powerful implementation with lazy imports of codecs ''' def __init__(self): super(MyLazyCodecsSearcher, self).__init__() self._registry = { 'lazy': self._lazy_fabric, 'lazy_broken': self._lazy_broken_fabric } def lookup(self, encoding): codecs_fabric = self._registry.get(encoding, None) if codecs_fabric: return codecs_fabric() raise LookupError def _lazy_fabric(self): from encodings import utf_8 return utf_8.getregentry() def _lazy_broken_fabric(self): try: from encodings import utf_9 except ImportError: raise LookupError else: return utf_9.getregentry() LazySearcher = MyLazyCodecsSearcher() codecs.register(LazySearcher) assert isinstance(LazySearcher, CodecsSearcher) is True assert isinstance(codecs.lookup('lazy'), codecs.CodecInfo) is True assert ('lazy' in LazySearcher.get_available_codec_names()) is True try: codecs.lookup('lazy_broken') except Exception as e: assert isinstance(e, LookupError) is True