super().__init_subclass__()
mro_annotations = (get_annotations(typ) for typ in cls.__mro__)
cls._annotations = {k: v for d in mro_annotations for k, v in d.items() if not k.startswith('_')}
sentinel = object()
cls._defaults = {k: getattr(cls, k, sentinel) for k in cls._annotations if getattr(cls, k, sentinel) is not sentinel}
Как можно упростить этот код? Пытаюсь разобраться с динамикой
Может я просто не знаю каких-то функций-хелперов для этого
а что он делает?
Сохраняет в словарики аннотации в порядке mro и default значения
что тут упрощать? не знаешь про циклы и условия в одну строку?
Чтобы правильно проинициализировать инстанс потом. А вообще просто эксперименты
Типа того, да, но без кодогенерации
ну я бы snetinel вынес наружу и dict comp поменял на обычный цикл чтобы два раза getattr не дергать/
Оно ж должно само работать, если я правильно понял о чём это вообще.
а код датаклассов читал?
Да, вот сижу изучаю паралельно
Получение аннотаций из родительских классов.
на удивление нет
Странно, действительно нет. Докстринги подхватывает, аннотации — нет. Выглядит как косяк.
def __init_subclass__(cls): super().__init_subclass__() mro_annotations = reversed([get_annotations(typ) for typ in cls.__mro__]) cls._annotations = {k: v for d in mro_annotations for k, v in d.items() if not k.startswith('_')} cls._defaults = {} for field in cls._annotations: default = getattr(cls, field, SENTINEL) if default is not SENTINEL: cls._defaults[field] = default Что-то такое выходит
Обсуждают сегодня