Страницы

Поиск по вопросам

пятница, 24 января 2020 г.

Как в питоне сделать структуру для хранения констант?

#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.

Комментариев нет:

Отправить комментарий