Форум сайта python.su
Здравствуйте, и снова Я с дурацкими костылями
Суть задачи: есть авто-сгенерированный код, к которому нужно написать адаптер для соответствия старым интерфейсам (короче, есть сгенерированный говнокод с помощью swagger-codegen, его нужно “адаптировать” не изменяя его самого, ибо каждая следующая ре-генерация попросту перепишет все изменения).
И вот вроде более-менее получается, теперь дошла очередь до моделей, а в частности “__init__” принимает различные параметры (в swagger они раздельны, у нас все передается одним параметром - dict-ом). Я не смог придумать ничего лучше, чем вот такое страшилище:
# file: my_pkg/models.py import inspect from swagger_client import models as swagger_models # patch init def init_adapter(self, config=None): if config is None: config = {} super(self.__class__, self).__init__(**config) # get all models from swagger generated codebase swagger_models = inspect.getmembers(swagger_models, predicate=inspect.isclass) for model_name, model_class in swagger_models: model = type(model_name, (model_class,), {'__init__': init_adapter}) # add to globals of module, so we can import: from my_pkg.models import SomeModel globals()[model.__name__] = model
Офлайн