Python的依赖注入和自定义Pickler
Python的依赖注入和自定义Pickler
我正在尝试序列化一个有外部依赖的类。
这个类的创建方式是在它的初始化函数中接收一个配置,然后创建一个接收该配置并将其分配给self的对象。
我想要实现的是,我想序列化这个类,并根据创建上下文,在反序列化时能够注入不同的配置。
class Foo: def __init__(self, some_value, config): self.some_value = some_value self.some_service = SomeService(config)
在这种情况下,我想要序列化self.some_value,但不包括self.some_service(也不包括配置,因为这是改变的)。
所以,正确的模式是什么?我已经查看了getstate/setstate dunder,它非常适合只序列化类的部分,但在反序列化时不注入配置。我本来期望Unpickler在这种情况下能够完美地工作,但似乎并不是这样(而且似乎只能在文件中工作?数据被序列化在redis数据库中,所以没有文件)。我宁愿不使用服务定位器,而是注入配置。
澄清:问题不是如何使用pickle或pickler。问题更多的是选择模式。对象中有外部依赖项(如self.some_service = SomeService(config)
所示)。
有两种重建那个对象的方法:
- 使用自定义Pickler/Unpickler来检测外部依赖项实例,对它进行哈希序列化,并在反序列化时给它需要的任何实例。
- 创建get/setstate dunder函数,检测服务并不序列化它。
两种方法都有其优缺点,但我想知道哪一种是推荐的。反序列化时,Unpickler可以具有外部依赖项,并在反序列化时将其重新分配给对象,但这似乎是一个“繁重的”解决方案。使用get/setstate dunder需要该类知道如何获取外部依赖项,这似乎有点“神奇”(该类获取外部服务而不是将它们提供给该类)。
admin 更改状态以发布 2023年5月21日