Source code for towhee.utils.handler_mixin

# Copyright 2021 Zilliz. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.


[docs]class HandlerMixin: """ This mixin creates handler management interfaces Args: handler_prefix: (`str`) `HandlerMixin` will create a set of handler management interfaces based on each handler_prefix. For instance, given a `handler_prefix`='task_finish', there will be two methods that are generated, `add_task_finish_handler` and `call_task_finish_handlers`. """ def add_handler_methods(self, *handler_prefix): class _HandlerMgr: """ Each type of handlers are managed by one `_HandlerMgr` """ def __init__(self): self._handlers = [] def add_handler(self, handler): if isinstance(handler, list): for h in handler: if not callable(h): raise AttributeError('handler must be callable') self._handlers += handler elif callable(handler): self._handlers.append(handler) else: raise AttributeError('handler must be callable') def call_handlers(self, *args): for h in self._handlers: h(*args) @property def handlers(self): return self._handlers self._handler_mgrs = [] for prefix in handler_prefix: if isinstance(prefix, str): handler_mgr = _HandlerMgr() self._handler_mgrs.append(handler_mgr) add_handler_method_name = 'add_' + prefix + '_handler' self.__setattr__(add_handler_method_name, handler_mgr.add_handler) call_handler_method_name = 'call_' + prefix + '_handlers' self.__setattr__(call_handler_method_name, handler_mgr.call_handlers) handler_getter_name = prefix + '_handlers' self.__setattr__(handler_getter_name, handler_mgr.handlers) else: raise AttributeError( '`HandlerMixin` can only take `str` as handler prefix, but found %s.' % (type(prefix)))