Python 3.8+的IOC容器
项目描述
一个现代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 查看哈希值)
关闭
punq-0.7.0.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | bb7a6cc75a2e7d51b861b0e11f4830a12617b3ee33dbced9ce2be6a98ba39d63 |
|
MD5 | 86ebc55b3ad6bffd9d70a7dfd0d3d5a2 |
|
BLAKE2b-256 | e6f1c31e86ce1ab85837d8e6a6868163bae3afaef01c49d45f1bfa479c1a5b90 |
关闭
punq-0.7.0-py3-none-any.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 7e0aca446c36a73674ec3fc078ec5e90e7a172ee349537d075ff20d73c3b1810 |
|
MD5 | cef2d0f68a16d20e1a32ee52cf6a6211 |
|
BLAKE2b-256 | 926ac89602766d4416371eb801c3de89eda45fcea4435836ba7c01d1da88d47a |