1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.

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

Тема в разделе "python", создана пользователем searchengines, 22 май 2019.


Поделиться в соц сетях

  1. searchengines

    searchengines Administrator

    Регистрация:
    5 янв 2019
    Сообщения:
    1.671
    Симпатии:
    2
    Баллы:
    38
    У меня есть данные карточек, которые я хочу хранить. Каждая карточка содержит: имя карты, ссылка изображение, список слов и ключевая буква. У меня есть несколько десятков таких карточек. Я жидаю, что структура карточек в ближайшем времени может начать менятся и будут добавляться\удаляться поля. Работать это будет как лямбда на сервере амазона, по этому при каждом действии будет новый вызов и новая инициализация всех данных.

    Попытка 1:

    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 подсказывала, если я что-то пропускаю.

    Попытка 2:

    @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. И в целом вроде выглядит довольно понятно. Однако я продолжил искать..

    Попытка 3:

    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. И вроде по своей природе подход enum из enum'ов довольно близок.

    Теперь, когда я все это проделал, я хочу совета, как все же лучше хранить мои данные и почему? Также меня не покидает ощущение, что возможно есть более простые способы решения моей задачи.
     

Поделиться этой страницей