При написании небольшого сервиса я обнаружил, что хотел бы построить объекты Python из словарей, а затем «сериализовать» их обратно в словари.
В настоящее время моя проблема заключается в том, что я использую смесьitemgetter
и vars
.Не дает мне ожидаемого результата.Конкретнее:
from operator import itemgetter
class Object(object):
def __init__(self, foo: str, bar: int):
self.foo, self.bar = foo, bar
@staticmethod
def from_dict(dictionary):
attributes = ["foo", "bar"]
return Object(*itemgetter(*attributes)(dictionary))
Итак, у нас есть статический метод с именем from_dict
, который должен взять словарь и вернуть объект Object
.
Это поведение, которое я хотел бы:
>> d = {"foo": "frobulate", "bar": 42}
>> obj = Object.from_dict(d)
>> vars(obj)
{"foo": "frobulate", "bar": 42}
Однако вместо этого я получаю:
>> d = {"foo": "frobulate", "bar": 42}
>> obj = Object.from_dict(d)
>> vars(obj)
{"foo": ("frobulate",), "bar": (42,)}
Где атрибуты задаются как кортежи из одного элемента.
Есть ли чистый Python способ получить это, дайте мне поведение, которое я ожидаю?
Я пытаюсь избежать дублирования, как:
class Object(object):
...
@staticmethod
def from_dict(dictionary):
return Object(foo=dictionary["foo"],bar=dictionary["bar"])
В конце концов я быхотел бы иметь универсальный метод, который принимает класс cls
и может анализировать любой объект из словаря:
def parse_object_from_dict(cls, attributes, dictionary):
return cls(*itemgetter(*attributes)(dictionary))
, который можно использовать как:
>> foo = parse_object_from_dict(Foo, ["a", "b"], {"a": 42, "b": 42})
>> obj = parse_object_from_dict(Object, ["foo", "bar"], {"foo": 42, "bar": 42}
и иметь атрибутыустановить как ожидалось (не как одноэлементные кортежи!).
Возможно ли это?Или даже хорошая идея?