#python #инспекция_кода
У меня есть данные карточек, которые я хочу хранить. Каждая карточка содержит: имя карты, ссылка на изображение, список слов и ключевая буква. У меня есть несколько десятков таких карточек. Я ожидаю, что структура карточек в ближайшем времени может начать меняться и будут добавляться\удаляться поля. Работать это будет как лямбда на сервере амазона, по этому при каждом действии будет новый вызов и новая инициализация всех данных. Вот такую структур создал с начала: class CardData: class Card1: title = 'Card 1' image_url = 'https://s3.amazonaws.com/...' words = ['postgame', 'amongst', 'megaton', 'montage', ...] key_letter = 't' class Card2: title = 'Card 2' image_url = 'https://s3.amazonaws.com/...' words = ['portside', 'riposte', 'deport', 'poser', ...] key_letter = 'r' Теперь я могу обращаться к своим данным например так getattr(CardData, 'Card1').words Что меня смутило: 1. Мне не понравилось все время писать getattr. 2. Вложенные классы все должны быть одной структуры. И хочется, чтобы IDE подсказывала, если я что-то пропускаю. Какие еще есть варианты?
Ответы
Ответ 1
Для версии python 3.7+ стоит использовать dataclass: @dataclass(frozen=True) class Card: title: str image_url: str words: list key_letter: str cards = {'card1': Card(title='Card 1', image_url='https: // s3.amazonaws.com /...', words=['postgame', 'amongst', 'megaton', 'montage', ...], key_letter='t'), 'card2': Card(title='Card 1', image_url='https://s3.amazonaws.com/...', words=['postgame', 'amongst', 'megaton', 'montage', ...], key_letter='t')} Получать данные стало проще cards['card1'].words. Для версий младше python 3.7 можно еще попробовать Enum from enum import Enum class ExtEnum(Enum): def __getattr__(self, item): # сделаем Enum из Enum'ов if item != '_value_': return getattr(self.value, item).value raise AttributeError class CardData(ExtEnum): class Card1(Enum): title = 'Card 1' image_url = 'https://s3.amazonaws.com/...' words = ['postgame', 'amongst', 'megaton', 'montage', ...] key_letter = 't' class Card2(Enum): title = 'Card 2' image_url = 'https://s3.amazonaws.com/...' words = ['portside', 'riposte', 'deport', 'poser', ...] key_letter = 'r' Данные получать все так же удобно CardData['Card2'].words.
Комментариев нет:
Отправить комментарий