从 Python 中的初始值设定项内部调用 API 不好吗?

Is calling an API from inside an initializer in Python bad?

我有一个 Python class 需要一些数据才能初始化。这些数据通常是使用来自另一个模块的函数获得的,该函数调用 API。我的 class' 初始化程序采用的参数之一与可用于通过 API.

获取资源的 ID 相同

从初始化程序内部调用 API 并获取所需的数据将使初始化时间更短(更清晰?)。但我担心这会使 class 更难测试,并在代码深处引入依赖关系。

我正在尝试设计以可维护和可测试的方式实现它的最佳方法。

在初始化器中直接调用API模块,获取完成初始化所需的数据会不会不好?还是从外部调用 API 并将数据传递给初始化程序更好?

“正常”方式(1) 是将依赖函数、模块或 class 传递给构造函数本身。

然后,在您的生产代码中,传入真实的东西。在您的测试代码中,传入一个虚拟代码,它的行为将完全符合您对特定测试用例的期望。

这实际上是 half-way 您所设定的两件事之间的衡量标准。

换句话说,类似于:

def do_something_with(something_generator):
    something = something_generator.get()
    print(something)

# Real code.
do_something_with(ProductionGenerator())

# Test code.
class TestGenerator:
    def get(self):
        return 42

do_something_with(TestGenerator())

如果您不愿意总是传入依赖项,则可以使用默认值之类的东西来绕过它,并在函数中创建它如果没有给定:

def do_something(something_generator=None):
    if something_generator is None:
        local_gen = ProductionGenerator()
    else:
        local_gen = something_generator

    something = something_generator.get()
    print(something)

# Real code.
do_something()

# Test code.
class TestGenerator:
    def get(self):
        return 42

do_something(TestGenerator())

(1) 当然,按照我的方式定义:-)