在分层调用中传递带有默认值的关键字参数

问题描述 投票:0回答:1

我正在开发一个 python 库,我想为用户提供一些灵活性。我面临以下挑战。

假设我向用户公开了类

Client
,其定义如下:

class Client:
    def __init__(self, path=None):
        self.file_obj = FileOpener(path = path)
    

我的

FileOpener
课程是:

class FileOpener:
    def __init__(self, path='my/default/path'):
        # My logic 
        pass

在上面的代码中,问题是,如果用户将

Client
对象初始化为
c = Client()
,我的底层
FileOpener
类会接收
None
作为路径。但我希望即使通过了
None
,它也应该选择默认路径。

以下是我针对这个问题提出的一些解决方案,但它们都有些缺陷:

  1. 最基本的方法 - 过滤参数并仅传递那些不是

    None
    的参数。我不想放置 if-else 梯子或创建任何不必要的
    dict
    来存储值。它不可维护/可读,新的程序员很容易搞砸。

  2. 我可以在

    Client
    类本身中定义默认值。如果用户没有传递任何内容,它将收到默认值。问题是,假设我有多个层,将来我想更改默认值,我需要在各处更改它。因此这种方法根本不可维护。

  3. 我想到的第二件事是,使用

    **kwargs
    ,我可以轻松地传递给底层对象。如果用户没有显式传递它,则默认情况下不会传递
    None
    。但现在我的用户不知道我的班级正在使用什么参数。他每次都需要浏览文档,并且无法利用他的代码编辑器(例如 - 在 VS Code 中,您可以使用自动完成功能)。

我想了解是否有解决此问题的标准方法。或者有任何建议可以消除我的方法中的缺陷。我想要一个可维护的解决方案,这样如果将来有人贡献,他只需查看代码就可以理解并且不会搞砸。

python python-3.x design-patterns
1个回答
0
投票

即使通过了

None
,它也应该选择默认路径。

如果您可以控制

FileOpener
我建议采用以下方法

class FileOpener:
    def __init__(self, path='my/default/path'):
        if path is None:
            path = 'my/default/path'
        # logic 
        pass

观察默认路径出现两次,但两者都包含在单个方法中。如果其他人只是更改其中之一,则可能会出现问题,以检测我建议为您的代码提供测试用例,该测试用例将检查相关行为是否与不给出

path
和给出
None
相同,请参阅
unittest
python
中提供测试的常用方法。

© www.soinside.com 2019 - 2024. All rights reserved.