如何使用 Python 模块 'attrs' 实现 "attr.asdict(MyObject)" 的反转
How to achieve the reverse of "attr.asdict(MyObject)" using Python module 'attrs'
在documentation of Python module attrs
stated中有一种方法可以将属性'class转换为字典表示:
示例:
>>> @attr.s
... class Coordinates(object):
... x = attr.ib()
... y = attr.ib()
...
>>> attr.asdict(Coordinates(x=1, y=2))
{'x': 1, 'y': 2}
我如何实现相反的目标:从其有效的字典表示中获取 Coordinates
的实例,无需样板文件并享受 attrs
模块?
显然就像在相应的 attrs
class 实例化中使用字典解包 (double star) 运算符一样简单。
示例:
>>> Coordinates(**{'x': 1, 'y': 2})
Coordinates(x=1, y=2)
我在我的网络应用程序中这样做是为了能够 serialize/de-serialize 进入 JSON:
首先,我在我的 classes 上创建了一个方法,returns 一个更易于序列化的版本:
def asdict(self, serializable=True):
if serializable:
as_dict['type'] = self.__class__.__name__
return as_dict
else:
return attr.asdict(self)
然后当我需要将其中一个字典(实际上 JSON 个对象)转换回 class 实例时:
obj_type = values.pop('type')
if obj_type in obj_list:
obj = getattr(sys.modules[__name__], obj_type)(**values)
作为一种更通用的解决方案,它适用于嵌套的属性 类、枚举或任何其他类型的注释结构,您可以使用 https://github.com/Tinche/cattrs
示例:
import attr, cattr
@attr.s(slots=True, frozen=True) # It works with normal classes too.
class C:
a = attr.ib()
b = attr.ib()
instance = C(1, 'a')
cattr.unstructure(instance)
# {'a': 1, 'b': 'a'}
cattr.structure({'a': 1, 'b': 'a'}, C)
# C(a=1, b='a')
在documentation of Python module attrs
stated中有一种方法可以将属性'class转换为字典表示:
示例:
>>> @attr.s
... class Coordinates(object):
... x = attr.ib()
... y = attr.ib()
...
>>> attr.asdict(Coordinates(x=1, y=2))
{'x': 1, 'y': 2}
我如何实现相反的目标:从其有效的字典表示中获取 Coordinates
的实例,无需样板文件并享受 attrs
模块?
显然就像在相应的 attrs
class 实例化中使用字典解包 (double star) 运算符一样简单。
示例:
>>> Coordinates(**{'x': 1, 'y': 2})
Coordinates(x=1, y=2)
我在我的网络应用程序中这样做是为了能够 serialize/de-serialize 进入 JSON:
首先,我在我的 classes 上创建了一个方法,returns 一个更易于序列化的版本:
def asdict(self, serializable=True):
if serializable:
as_dict['type'] = self.__class__.__name__
return as_dict
else:
return attr.asdict(self)
然后当我需要将其中一个字典(实际上 JSON 个对象)转换回 class 实例时:
obj_type = values.pop('type')
if obj_type in obj_list:
obj = getattr(sys.modules[__name__], obj_type)(**values)
作为一种更通用的解决方案,它适用于嵌套的属性 类、枚举或任何其他类型的注释结构,您可以使用 https://github.com/Tinche/cattrs
示例:
import attr, cattr
@attr.s(slots=True, frozen=True) # It works with normal classes too.
class C:
a = attr.ib()
b = attr.ib()
instance = C(1, 'a')
cattr.unstructure(instance)
# {'a': 1, 'b': 'a'}
cattr.structure({'a': 1, 'b': 'a'}, C)
# C(a=1, b='a')