Python依赖注入框架
是否有一个与Python的Guice()等效的框架?我没有使用它,但该框架基于Spring和实现 Python项目中似乎还有一个Guice:除此之外: 是基于Java的Spring框架和Spring安全性的一个分支,面向Python。此项目当前包含以下功能:Python依赖注入框架,python,dependency-injection,Python,Dependency Injection,是否有一个与Python的Guice()等效的框架?我没有使用它,但该框架基于Spring和实现 Python项目中似乎还有一个Guice:除此之外: 是基于Java的Spring框架和Spring安全性的一个分支,面向Python。此项目当前包含以下功能: -使用经典XML或python@Object decorator(类似于Spring JavaConfig子项目)将事物连接在一起。尽管@Object格式与Guice样式(集中连接与每个类中的连接信息)不同,但它是连接python应用
- -使用经典XML或python@Object decorator(类似于Spring JavaConfig子项目)将事物连接在一起。尽管@Object格式与Guice样式(集中连接与每个类中的连接信息)不同,但它是连接python应用程序的一种有价值的方法
- -在水平编程范式(而不是垂直OOP继承)中为事务、安全性和缓存等应用拦截器
- DatabaseTemplate—从数据库读取需要打开游标、读取行和关闭游标以及异常处理程序的单调循环。使用这个模板类,您只需要SQL查询和行处理函数。SpringPython完成了其余的工作
- 数据库事务-用事务包装多个数据库调用会使代码难以阅读。此模块提供多种方式来定义事务,而不会使事情变得复杂
- 安全-插件安全拦截器,利用身份验证和域授权锁定对方法的访问
- 远程处理—很容易将本地应用程序转换为分布式应用程序。如果您已经使用IoC容器构建了客户机和服务器,那么从本地到分布式只是一个配置更改
- 示例-为了帮助演示Spring Python的各种功能,创建了一些示例应用程序:
- PetClinic-Spring框架的示例web应用程序已使用python web容器从头开始重新构建,包括:。请查看它,了解如何使用此框架的示例。(注意:其他python web框架将在将来添加到此列表中)
- SpringWiki——Wiki是存储和管理内容的强大方式,因此我们创建了一个简单的示例李>
- SpringBot—使用SpringPython构建一个微型Bot来管理开源项目的IRC通道
或者查看Dennis Kempin(2008年8月)的博文。如果您只想用Python进行依赖项注入,就不需要框架。看一看。这真的很快很容易,而且只有c。50行代码。有一个有点Guicey的项目。它非常活跃,代码比Spring python少得多,但我仍然没有找到使用它的理由。如果你喜欢一个非常小的解决方案,它有一个小函数,它只是一个依赖项设置器
下面是一个依赖项注入容器的小示例,该容器基于构造函数参数名称进行构造函数注入:
我喜欢这个简单整洁的框架 依赖注入作为一种形式化模式在Python中不如 在其他语言中,主要是因为它支持关键字 参数、模拟对象的容易程度及其动态特性 自然 这就是说,一个协助这一进程的框架可以消除很多障碍 从更大的应用锅炉板。这就是喷油器可以工作的地方 救命啊。它自动且可传递地提供关键字参数 他们的价值观。作为一个额外的好处,Injector可以很好地鼓励 通过使用模块s划分代码 虽然受到Guice的启发,但它并没有盲目地复制其功能 应用程序编程接口。提供pythonicapi胜过忠诚 还有一个dyject(),一个用于Python 2和Python 3的轻量级框架,它使用内置的ConfigParser,pinject()是一个较新的替代方案。它似乎是由Google维护的,并且遵循与Java对应的Guice()类似的模式。如果你想要一个类似Guice的(他们说是新的),我最近在Python3中做了一个非常接近的东西,它最适合我对辅助项目的简单需求 您只需在方法上进行@inject(\uuuu init\uuuu当然包括在内)。 其余部分通过注释完成
from py3njection import inject
from some_package import ClassToInject
class Demo:
@inject
def __init__(self, object_to_use: ClassToInject):
self.dependency = object_to_use
demo = Demo()
我会在这里留下我的5美分:) 已更新 一段时间过去了,依赖注入器现在有点不同了。最好从依赖项注入器GitHub页面开始获取实际示例-我制作了一个lib来实现这一点 我希望这有帮助 可在pypi上获得: 有了它,你可以用python2注射
import logging
from logging import Logger
from pycdi import Inject, Singleton, Producer
from pycdi.shortcuts import call
@Producer(str, _context='app_name')
def get_app_name():
return 'PyCDI'
@Singleton(produce_type=Logger)
@Inject(app_name=str, _context='app_name')
def get_logger(app_name):
return logging.getLogger(app_name)
@Inject(name=(str, 'app_name'), logger=Logger)
def main(name, logger):
logger.info('I\'m starting...')
print('Hello World!!!\nI\'m a example of %s' % name)
logger.debug('I\'m finishing...')
call(main)
以及使用python3中的类型提示
import logging
from logging import Logger
from pycdi import Inject, Singleton, Producer
from pycdi.shortcuts import call
@Producer(_context='app_name')
def get_app_name() -> str:
return 'PyCDI'
@Singleton()
@Inject(logger_name='app_name')
def get_logger(logger_name: str) -> Logger:
return logging.getLogger(logger_name)
@Inject(name='app_name')
def main(name: str, logger: Logger):
logger.info('I\'m starting...')
print('Hello World!!!\nI\'m a example of %s' % name)
logger.debug('I\'m finishing...')
call(main)
我最近发布了一个用于python中DI的整洁(IMHO)微库:
在多年使用Python而没有任何DI自动连接框架和Java with Spring之后,我逐渐意识到简单的Python代码通常不需要依赖注入自动连接框架(自动连接是Guice和Spring在Java中都做的事情),也就是说,这样做就足够了:
def-foo(dep=None):#非常适合单元测试!
...
这是纯粹的依赖注入(非常简单),但没有神奇的框架为您自动注入它们
尽管在我处理更大的应用程序时,这种方法不再适用。因此,我提出了一个微型框架,它不会让人觉得不符合python,但可以提供一流的依赖注入自动连接
在人类的座右铭下™ 这就是它看起来的样子:
#some_service.py
服务类别:
@自动连线
定义初始化__(
自己
数据库:自动连线(数据库),
消息代理:自动连线(列表[代理]),
):
挂起=数据库。检索\u笔
import logging
from logging import Logger
from pycdi import Inject, Singleton, Producer
from pycdi.shortcuts import call
@Producer(_context='app_name')
def get_app_name() -> str:
return 'PyCDI'
@Singleton()
@Inject(logger_name='app_name')
def get_logger(logger_name: str) -> Logger:
return logging.getLogger(logger_name)
@Inject(name='app_name')
def main(name: str, logger: Logger):
logger.info('I\'m starting...')
print('Hello World!!!\nI\'m a example of %s' % name)
logger.debug('I\'m finishing...')
call(main)
class MyObject:
my_service: MyService = INJECTED
my_config: str = INJECTED