我正在寻找一些建议,以避免一个类两次实例化,这更像是一个设计模式问题。我正在使用Python Click库创建一个应用程序。在
我有一个Settings
类,它首先将所有初始默认设置加载到字典中(硬编码到应用程序中),然后从用户计算机上的TOML文件将所有设置覆盖(如果指定的话)加载到字典中,然后最后将两者合并并使它们作为类实例(settings.<something>
)的属性使用。在
对于大多数设置,我也希望能够指定命令行标志。然后,优先事项变为:
为了达到这个结果,我发现,在使用Click的decorators时,我必须做如下操作:
^{1}$settings = Settings()
行来为@click.option
修饰符提供default
值。default
值可以来自用户覆盖TOML文件(如果存在),也可以来自应用程序默认值。在Settings
类中的其他属性。在我的问题是,哪个更好?有没有办法在其他click.option
装饰器中使用pass_settings
装饰器?还是应该完全放弃使用click.make_pass_decorator
?在
解决不想实例化
Settings
两次的问题的一种方法是从click.Option
继承,并将设置实例插入到 上下文直接类似于:自定义类:
使用自定义类:
要使用自定义类,请将
^{pr2}$cls
参数传递给@click.option()
修饰符,如下所示:这是怎么回事?
这是因为click是一个设计良好的OO框架。
@click.option()
修饰符通常实例化一个click.Option
对象,但允许使用cls参数覆盖此行为。所以相对来说 很容易在我们自己的类中从click.Option
继承并超越所需的方法。在在本例中,我们使用两个闭包来捕获设置实例和参数名。在返回的 类我们覆盖
click.Option.handle_parse_result()
以允许我们在上下文中插入设置对象。 这允许pass_settings
装饰器在上下文中查找设置,因此不需要创建新实例。在测试代码:
测试结果:
相关问题 更多 >
编程相关推荐