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.pyauto_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.Listtyping.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–允许非侵入性地指定单例类型。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java我能在这个程序中更好地使用内存吗?   为什么我的Java while循环迭代了一半   java IntelliJ IDEA不在构建时复制资源   socket仅在Java TCP服务器输出上检查客户端断开连接   java游戏物理摩擦   java片段onClick调用方法   symja数学分析器中无法识别java Abs[x]   java在使用泛型时创建二进制搜索树类的实例?   java在外键约束表上的添加和删除   语法java表达式的含义,如果有条件   java创建内联对象并作为参数传递   是否有相当于Redis排序集(zset)的Java数据结构   java找不到适合的方法(无参数)   音频文件操作给定字节帧的音量Java   Eclipse4不以JavaWebStart启动   java如何使用org在JSON对象中获取嵌套的键元素。json?   java与Jackson的反序列化:“org.codehaus.Jackson.map.JsonMappingException:无法反序列化[projectname]的实例。”   字符串的Java正则表达式   spring集成上的java检测缺火指令