VladimirZhid
@VladimirZhid
Нравится делать что-то интересное и полезное.

Как лучше создавать словари с ключами не в виде строки?

Товарищи! небольшой вопросик. И заранее спасибо)
Есть во такой небольшой код:
def create_serializable_data(movie: Movie):
    """
    Create serializable object from Movie
    :type movie: Movie
    :param movie: An instance of Movie
    :return:
    """
    result = {}
    good_fileds = ["actors", "composers", "counties", "directors", "genres", "id", "producers", "profit_russia",
                   "profit_usa", "profit_world", "rating", "scenarios", "title", "title_original", "trailers", "year"]
    for key in movie.__dict__.keys():
        if key in good_fileds:
            result[key] = movie.__dict__.get(key)
    return result

Как видите я создаю новый ключ в словаре result с ключем key и в итоге не могу обратиться к нему через точку, а только через метод get() или через литерал [] что как бы мне не хотелось. Есть ли способ создать ключ не как строчку?

В питоне вообще не бум-бум только изредка сталкиваюсь, т.ч не судите строго

Всем мир!

Уточнение:
В result хотелось бы видеть {key: value}, а не {'key': value}
  • Вопрос задан
  • 320 просмотров
Решения вопроса 1
leahch
@leahch
3D специалист. Dолго, Dорого, Dерьмово.
Делаете такой класс - https://goodcode.io/articles/python-dict-object/
class objdict(dict):
    def __getattr__(self, name):
        if name in self:
            return self[name]
        else:
            raise AttributeError("No such attribute: " + name)

    def __setattr__(self, name, value):
        self[name] = value

    def __delattr__(self, name):
        if name in self:
            del self[name]
        else:
            raise AttributeError("No such attribute: " + name)

Ну и далее
good_fileds = set(["actors", "composers", "counties", "directors", "genres", "id", "producers", "profit_russia",
                   "profit_usa", "profit_world", "rating", "scenarios", "title", "title_original", "trailers", "year"])
keys = good_fileds.intersection(movie.__dict__)
result = objdict({k: movie.__dict__.get(k) for k in keys})

result.rating
result.actors
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы