нубский :)
У меня есть словарь:
my_dict = {"min": 1, "max": 2}
Есть класс, с такими атрибутами, который я инициализирую маппингом, как MyClass(**my_dict) - вопрос первый - на сколько это best/worst практика?
Едем дальше... min и max являются built-in функциями Python и таким образом я их переопределяю в классе из функций в переменную - ИМХО дерьмовый подход. Варианты, которые вижу я:
1. Переименовать в самом словаре. Но так как эти имена подтягиваются из файла конфигурации и изначально заданы сторонним разработчиком, то пользователю нужно держать в голове, что атрибут в официальной документации "min", а в моих конфигах, например "min_count". Мне кажется, не очень юзерфрендли.
2. Приводить имена в моем классе. Т.е. не использовать маппинг, а инициализировать класс так MyClass(min_count=my_dict['min']...), а потом под капотом преобразовывать (например в реквесте REST) обратно в "min". Больно гемморно, создание инстанса класса надо обновлять везде, при добавлении атрибутов, но может это бестпрактис?
3. Забить хер, на то что ругаются IDE и заниматься переопределением built-in функций, которые внутри класса все равно не используются.
4. Ваш вариант.
Переопределять built-in точно гнилая затея.
Спасибо, что подтвердили мои сомнения. А вот красивого решения придумать не могу.
ну вы ж в конструкторе потом сохраняете эти значения как поля экземпляра, верно ж?
class myclass(): def init(self, kwargs): for k, v in kwargs.items(): setattr(self, k, v)
в целом еще зависит, насколько большой объект, который вы скармливаете конструктору, если полей мало, то несложно и нормальные имена поставить. Опять же лично мое имхо 🙂
Хм... через кварги. Очень интересный варик.
Проблема в том, что объект обновляется с версией стороннего приложения и нужно будет в нескольких местах менять. С другой стороны, полей действительно не так много.
Тебе случайно не dataclass нужен?
Опа... Не успеваю релиз нотс читать... Я еще где-то в районе 3.6 нахожусь :)
Большое спасибо, за подсказку, это действительно может решить все мои вопросы, пойду вкуривать документацию по датаклассам.
Класс инициализируешь или инстанс?
Есть множество решений для классов-контейнеров для аргументов, от стандартного dataclass до marshmellow и pydantic, там же вроде как должен быть и маппинг имен. В dataclass_factory он точно есть
Обсуждают сегодня