非常快速的依赖注入库
yapic.di的Python项目详细描述
非常快Dependency Injection 对于python,它高度使用类型特性。有时更快 然后在python中进行类似的调用。
要求
仅适用于Python 3.7或更高版本
C++11可编译编译器。(仅当您希望从源代码构建时)
为Windows x86/x64和Linux x86/x64提供的控制盘
使用量
fromtypingimportGeneric,TypeVarfromyapic.diimport*T=TypeVar("T")classCar(Generic[T]):engine:Tdef__init__(self,engine:T):self.engine=engine# simplified Car classclassCar(Generic[T]):engine:Inject[T]classGasoline:passclassDiesel:passclassElectronic:passclassDieselCar(Car[Diesel]):passELECTRONIC_CAR=Token("ELECTRONIC_CAR")injector=Injector()injector.provide(Gasoline)injector.provide(Diesel)injector.provide(Electronic)injector.provide(DieselCar)injector.provide(ELECTRONIC_CAR,Car[Electronic])diesel=injector[DieselCar]assertisinstance(diesel,DieselCar)assertisinstance(diesel.engine,Diesel)electronic=injector[ELECTRONIC_CAR]assertisinstance(electronic,Car)assertisinstance(electronic.engine,Electronic)defdrive_diesel(car:DieselCar):assertisinstance(car,DieselCar)assertisinstance(car.engine,Diesel)injector.exec(drive_diesel)# you can set constant values, like a dictMEANING_OF_LIFE=Token("MEANING_OF_LIFE")injector[MEANING_OF_LIFE]=42assertinjector[MEANING_OF_LIFE]==42defquestion(q:MEANING_OF_LIFE):assertq==42injector.exec(question)# cached injectablelife_q=Injectable(question)# this is same as with injector.exec(question), but injectable is precachedlife_q(injector)
仅限关键字参数
classConfig(dict):def__init__(self):super().__init__(some_key=42)defget_kwarg(config:Config,*,name,type):ifname=="some_key":returnconfig[name]else:raiseNoKwOnly()deffn(*,some_key:str):assertsome_key==42injector=Injector()injector.provide(Config)injector.provide(fn,provide=[KwOnly(get_kwarg)])
有关详细信息,请参见Python Stub file或test files
释放过程
- 在setup.py 中更改VERSION。
- git add setup.py
- git commit -m "chore(bump): VERSION"
- git checkout release
- git merge master
- git tag -a VERSION -m "chore(bump): VERSION"
- git push && git push --tags
- git checkout master
- git merge release