在运行时解决缺少的参数
argresolver的Python项目详细描述
argresolver v0.3.3
解析器是一个简单的装饰器,用于在运行时解析(缺少)参数。 它执行各种任务,从查找环境变量作用域中的参数到简单的服务依赖注入。
一。Resolver
1.1条。Environment
1.2条。Map
1.3条。Chain
一。分解器
1.1条。环境
# We inject arguments from the environment variables scope to a simple function# We use a `prefix` to minimize clashes with other components# username will have a correponding DB_USERNAME, same for password and databasefromargresolverimportEnvironmentfromargresolver.utilsimportmodified_environ# We use it to alter the environment variables@Environment()defconnect(host,user,password):print("Connecting: {user}:{password}@{host}".format(**locals()))withmodified_environ(PASSWORD='my_pass'):connect('localhost','admin')# Prints: Connecting: admin:my_pass@localhost
# We inject arguments from the environment variables scope # to an instance __init__.# We use a `prefix` to minimize clashes with other components that have a username / password.# Argument username will have a correponding DB_USERNAME, same for password and databasefromargresolverimportEnvironmentfromargresolver.utilsimportmodified_environ# We use it to alter the environment variablesclassConnection:@Environment(prefix='DB')def__init__(self,username,password,database='default'):self.username=usernameself.password=passwordself.database=databasedef__str__(self):# Hint: In a real world example you won't put your password in here ;-)return"Connection(username='{self.username}', password='{self.password}'"\ ", database='{self.database}')".format(self=self)withmodified_environ(DB_USERNAME='admin',DB_PASSWORD='secret'):conn=Connection()print(str(conn))# Connection(username='admin', password='secret', database='default')
1.2条。地图
# We use the Map resolver to override an argument's default value # that is better suited for our needs.fromargresolverimportMap# Let's assume we cannot touch this code...classFoo:def__init__(self,arg1,arg2='I_dont_like_this_default'):self.arg1=arg1self.arg2=arg2def__str__(self):return"Foo(arg1='{self.arg1}', arg2='{self.arg2}')".format(self=self)# But we can alter the class and wrap a resolver around the class __init__ Foo.__init__=Map(dict(arg2="better_default"),default_override=True)(Foo.__init__)foo=Foo("this is arg1")print(str(foo))# Foo(arg1='this is arg1', arg2='better_default')
1.3条。链条
# We do some automatic dependency injection with fallbackfromargresolverimportChain,Const,Mapinject=Chain(Map(dict(service1="Service1",service2="Service2")),Const("Fallback Service"))classOrchestration:@injectdefbusiness_process1(self,service1,service2):print("Calling service:",service1)print("Calling service:",service2)@injectdefbusiness_process2(self,service1,service3):print("Calling service:",service1)print("Calling service:",service3)orchester=Orchestration()orchester.business_process1()# Prints:# Calling service: Service1# Calling service: Service2orchester.business_process2()# Prints:# Calling service: Service1# Calling service: Fallback Service