跳转到主要内容

Python 3.8+的IOC容器

项目描述

https://codecov.io/gh/bobthemighty/punq/branch/master/graph/badge.svg?token=52hQhaggnk Documentation Status

一个现代Python中无侵入性的依赖注入库。受Funq启发,Punq是一个你可以理解的依赖注入库。

  • 无全局状态

  • 无装饰器

  • 无应用于参数的奇怪语法

  • 小型简单代码库,100%测试覆盖率和开发友好型注释。

安装

Punq可在cheese shop上使用。

pip install punq

文档可在Read the docs上查看。

快速入门

Punq避免了全局状态,因此必须在应用程序的入口点显式创建一个容器

import punq

container = punq.Container()

一旦你有一个容器,你可以注册你的应用程序的依赖项。在最简单的情况下,我们可以使用某个键注册任何任意对象

container.register("connection_string", instance="postgresql://...")

然后我们可以从容器中请求该对象

conn_str = container.resolve("connection_string")

通常,我们想要注册实现有用服务的对象。

class ConfigReader:
   def get_config(self):
      pass

class EnvironmentConfigReader(ConfigReader):
   def get_config(self):
      return {
         "logging": {
            "level": os.env.get("LOGGING_LEVEL", "debug")
         },
         "greeting": os.env.get("GREETING", "Hello world")
      }

container.register(ConfigReader, EnvironmentConfigReader)

现在我们可以解构配置读取器服务,并接收一个具体实现

config = container.resolve(ConfigReader).get_config()

如果应用程序的依赖项有自己的依赖项,Punq也会注入它们

class Greeter:
   def greet(self):
      pass


class ConsoleGreeter(Greeter):
   def __init__(self, config_reader: ConfigReader):
      self.config = config_reader.get_config()

   def greet(self):
      print(self.config['greeting'])


container.register(Greeter, ConsoleGreeter)
container.resolve(Greeter).greet()

如果你只想在没有基类的情况下解构对象,那也是可以的

class Greeter:
   def __init__(self, config_reader: ConfigReader):
      self.config = config_reader.get_config()

   def greet(self):
      print(self.config['greeting'])

container.register(Greeter)
container.resolve(Greeter).greet()

如果你需要某种原因有一个单例对象,我们可以告诉punq注册对象的一个特定实例

class FileWritingGreeter:
   def __init__(self, path, greeting):
      self.path = path
      self.message = greeting
      self.file = open(self.path, 'w')

   def greet(self):
      self.file.write(self.message)


one_true_greeter = FileWritingGreeter("/tmp/greetings", "Hello world")
container.register(Greeter, instance=one_true_greeter)

你可能不知道在注册时所有参数,但你可以稍后提供它们

container.register(Greeter, FileWritingGreeter)
greeter = container.resolve(Greeter, path="/tmp/foo", greeting="Hello world")

相反,你可能希望在注册时提供参数,而无需将它们添加到容器中

container.register(Greeter, FileWritingGreeter, path="/tmp/foo", greeting="Hello world")

更详细的文档可在Read the docs上查看。

GitHub 工作流程、nox 配置和代码风格检查来自 Hypermodern Python,在此表示感谢。

项目详情


下载文件

下载适用于您平台的项目文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源代码分发

punq-0.7.0.tar.gz (7.3 kB 查看哈希值)

上传时间 源代码

构建分发

punq-0.7.0-py3-none-any.whl (7.7 kB 查看哈希值)

上传时间 Python 3

由以下支持