Вы можете использовать выражение генератора для получения соответствующих значений, декодируя строку, затем перебирая значения, соответствующие x
и y
.
>>> from operator import itemgetter
>>> coords = itemgetter('x', 'y')
>>> Point(*(int(x) for x in coords(json.loads(jsonString))))
Point(x=3, y=5)
coords
- это функция, которая возвращает кортеж, состоящий из значений x
и y
его аргумента. Выражение генератора гарантирует, что каждое значение преобразуется в int
, а синтаксис *
распаковывает генератор в отдельные аргументы.
Однако более идиоматическим решением c было бы определение метода класса для создания Point
с учетом соответствующего объекта:
@dataclass
class Point:
x: int
y: int
@classmethod
def from_dict(cls, d):
return cls(d['x'], d['y'])
p = Point.from_dict(json.loads(jsonString))
Вы также можете определить from_json
метод класса для переноса from_dict
:
@dataclass
class Point:
x: int
y: int
@classmethod
def from_dict(cls, d):
return cls(d['x'], d['y'])
@classmethod
def from_json(cls, j):
return cls.from_dict(json.loads(j))
p = Point.from_json(jsonString)
Хотя здесь это не показано, методы класса предоставляют места для проверки переданной JSON строки или аргумента, поэтому вы можете более изящно обрабатывать такие вещи, как отсутствующие ключи, дополнительные ключи, JSON значения, которые не являются объектами и т. д. c.