Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 29, 2021 18:08:17

Master_Sergius
Зарегистрирован: 2013-09-12
Сообщения: 271
Репутация: +  7  -
Профиль   Отправить e-mail  

Патчим __init__ и позволяем импортить класс(ы) или грязный хако-костыль

Здравствуйте, и снова Я с дурацкими костылями

Суть задачи: есть авто-сгенерированный код, к которому нужно написать адаптер для соответствия старым интерфейсам (короче, есть сгенерированный говнокод с помощью 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

Если кто-то знает решения получше, прошу поделиться.



———————————————————————————
Мой блог о семействе *nix: http://nixtravelling.blogspot.com/

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version