#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.
Комментариев нет:
Отправить комментарий