提供click的dropin替换,扩展它以在各种OOP上下文中工作
objclick的Python项目详细描述
点滴
objclick
提供了
click,将其扩展到
各种OOP上下文。在
click
是一个非常好的包,可以快速轻松地定义可组合性
通过在
实现命令“主”功能的函数的顶部。在
然而,从设计上讲,它在OOP上下文中并不能很好地发挥作用。特别地,
将类的实例方法提升为click
并不容易
命令。这个包试图通过在
click
在某些情况下,它也能很好地处理类。在
举一个激励人心的例子,假设您有一个实现 命令行:
>>>importobjclickasclick>>>importabc>>>classBaseService(metaclass=abc.ABCMeta):...defexplain(self):..."""Explain this service; must be implemented by subclasses."""......@click.command()...defmain(self):...print('Hello, let me tell you about myself.')...self.explain()...
这个类现在必须用explain
的实现作为子类,但是
子类不需要重新实现CLI的其余部分:
由于MyService.main
是一个实例方法,我们不能简单地调用
MyService.main()
运行CLI的“main”功能。就像一个
一个类的普通实例方法,我们必须先实例化该类,然后
对实例调用方法:
>>>service=MyService()>>>service.main([],standalone_mode=False)Hello,letmetellyouaboutmyself.IamaninstanceofMyService.
(注:
standalone_mode
是对测试有用的click
main函数的标准参数
命令。)
这个包的初始版本仍然是实验性的,但是 实现了许多其他有用的案例。在
其中一个例子是classgroup
装饰器给出的。这允许定义
类方法上绑定到类的类方法上的命令组
而不是类的实例。在一般情况下
如果
classgroup返回它定义的类的instance,这个实例
将作为self
参数传递给添加的任何实例方法
作为小组的下属。在
例如,这里的命令组使用--config
选项,作为
实例化Service
类需要配置。所有子命令
的Service.main
可以访问配置:
>>>importobjclickasclick>>>importjson,pprint>>>classService:...def__init__(self,config):..."""Instantiate `Service` with a configuration dict."""......self.config=config......@click.classgroup()...@click.option('--config',type=click.File())...defmain(cls,config=None):...ifconfigisnotNone:...withconfigasf:...config=json.load(f)...else:...config={}......print(f'Starting up {cls.__name__}...')...returncls(config)......@main.command()...defshow_config(self):...print('Config:',end=' ')...pprint.pprint(self.config)...
现在,Service
定义的CLI可以如下方式调用:
>>>importtempfile>>>config={'option1':'a','option2':'b'}>>>withtempfile.NamedTemporaryFile(mode='w')asf:...json.dump(config,f)...f.flush()...# like `service.py --config <config-file> show-config`...args=['--config',f.name,'show-config']...Service.main(args,standalone_mode=False)...StartingupService...Config:{'option1':'a','option2':'b'}
对象单击更改日志
v0.1.1(2020-10-02)
错误修复
- 修复了调用
classcommand
或classgroup
通过子类中的super()
。在
版本0.1.0(2020-10-01)
- 初始版本。在
- 项目
标签: