类 的允许列表中的加载程序工厂

Loader factory from allowed list of classes

我希望能够根据参数调度 class 的实例化。

这已被问到 here and the following answer 提供了一个很好的解决方案,但 globals()[name]() 的使用对我来说似乎有点难看。另外,我理解如果文件是主文件它是如何工作的,但不确定如果这个模块被导入到其他地方为什么它会工作。

现在,我想要的不是能够使用所有可能的加载器 classes,而是能够定义所有可用加载器的子集。基本上有一个 list/dict 来切换可用性。例如,用例

  1. 我正在开发一个新的加载程序,但不希望它被使用
  2. 我想提供可用加载程序的列表。

根据之前链接的答案,我尝试过的是将带有键的字典定义为对用户更友好的字符串,并为充当加载器的 class 的名称赋值。

loaders = {'sqlite': sqlite_loader, 'mysql': mysql_loader}

class loader:
    @staticmethod
    def get_loader(name):
        return loaders[name]()

    def available_loaders(self):
        return [k for k in available_loaders.keys()]

class sqlite_loader(loader): pass

class mysql_loader(loader): pass

print(type(loader.get_loader('sqlite')))
print(type(loader.get_loader('mysql')))

此代码无法使用 sqlite_loader 未定义的错误。我明白这一点,但我无法找到要添加到 loaders 字典中以使其能够找到加载器 classes.

的内容

loaders 必须在定义它所指的 类 之后定义。只需将 *_loader 定义移动到顶部。