python 3.6中的类型提示带来的依赖注入+
auto-init的Python项目详细描述
auto init是一个依赖注入工具,由于类型提示,它可以在python 3.6+中工作。 如果你写了很好的面向对象的代码并且把接口和实现分开 你可以从中受益。
简介
您知道吗,如果为类主体中的属性提供类型提示,并且不设置值,那么 属性实际上没有初始化(在类中或实例中)?
classPoint:x:inty:intz:int=None
对于p,只设置了Point的实例p.z。这很好,因为我们可以建立依赖关系 注射机构在上面!
简单示例
fromauto_initimportAutoInitContextctx=AutoInitContext()p:Point=ctx.get_instance(Point)assertp.x==0assertp.y==0assertp.zisNone
注意,Point类也可以是一个数据类,它也可以工作。
不是那么简单的例子
importloggingfromauto_initimportAutoInitContextclassWorker:enterprise:"Enterprise"log:logging.LoggerclassReporter:enterprise:"Enterprise"log:logging.LoggerclassEnterprise:worker:Workerreporter:Reporterctx=AutoInitContext()ctx.register_instance(logging.getLogger(__name__))ctx.register_singleton(Enterprise)enterprise:Enterprise=ctx.get_instance(Enterprise)assertenterprise.worker.logisenterprise.reporter.logassertenterprise.worker.enterpriseisenterpriseassertenterprise.reporter.enterpriseisenterprise
安装
pip install auto-init
API
- AutoInitContext()
创建新的自动初始化上下文。
- register_singleton(instance_type: Type, factory: Callable=None)
- 注册单一类型。这与register_instance不同,这里是auto init 负责单例实例的创建和初始化。这应该 当singleton本身具有需要注入的依赖项时使用。请参阅enterprise.py 在auto_init/examples/下的示例。 如果不提供factory,则使用instance_type创建实例。
- register_factory(instance_type: Type, factory: Callable)
- 注册一个可调用的,当请求on时,调用它来创建指定类型的新实例。
- register_instance(instance, instance_type: Type=None)
- 注册在请求指定类型的实例时应始终返回的实例。
- get_instance(instance_type: Type) -> Any
- 获取指定类型的实例。
- init_instance(instance)
- 初始化实例的任何单元化属性。
更改日志
v0.0.5
- 支持将用typing.List和typing.Dict注释的属性初始化为空列表或字典。 其他带typing.*-注释的属性初始化为None。
- 不要试图从typing.*类中获取类型提示,它会在Python3.7中引发异常,并且不会返回 任何在Python3.6中有用的东西。
- 修复Python3.6的依赖项,删除不必要的^{TT20}$和^{TT21}$ Python3.7的依赖项。
- Travis CI设置。
v0.0.4
- 完成重写以处理循环引用。侵入性的方法是不好的。
- 类型提示中的前向引用在Python3.7中实际上不起作用,即使使用Futures也是如此。让我们使用Python3.6。
v0.0.3
- 添加了AutoInitContext.explicit_only–允许将上下文标记为仅使用指定的 提供程序并让所有其他的保持不变。
- 如果类型提示包含默认值(声明类属性),则相应的实例属性将 通过引用复制类属性,除非上下文中指定了显式提供程序。 这意味着x: int = None将被初始化为None,而不是0。
v0.0.2
- 非介入式自动初始化:初始化实例的函数auto_init和方法AutoInitContext.auto_init。 没有对用户的类进行任何更改。
- 添加了AutoInitContext.singleton_types–允许非侵入性地指定单例类型。