Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python依赖注入框架_Python_Dependency Injection - Fatal编程技术网

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应用

是否有一个与Python的Guice()等效的框架?

我没有使用它,但该框架基于Spring和实现

Python项目中似乎还有一个Guice:

除此之外:

  • 是基于Java的Spring框架和Spring安全性的一个分支,面向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通道

    作为monkeypatching的替代方案,我喜欢DI。一个新的项目,如可能符合要求的项目


    或者查看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