通常,如果用户缺少软件包,我是否应该编写代码主体的多个版本



假设我正在构建一个python程序,一开始,我导入两个模块 - somets ,默认情况下包含在python库中,and sometsingselse ,不是。

我有两个几乎相同的功能,一个功能无需 sometsingselse ,但也是第二个版本,可以更好地奏效。虽然理想情况下,人们只会安装所需的依赖项,但如果在那里的机器/系统与> something> sometsingselse 软件包不兼容的用户可以访问。示例:

try:
   import something
   import somethingElse
except ImportError:
   import something
if not ImportError:
   versionA()
else:
   versionB()

这是好的做法,还是有更好的方法来解决此问题?

谢谢!

通常,最好拥有一个处理依赖项的PIP requirements.txt文件或setup.py。但是,如果您出于任何原因需要这样做,我认为最好将一个单个班级用作图书馆的包装,而消费者不在乎进口的。例如,在您的模块中,您将拥有类似的东西:

try:
    import better_lib
    class LibAPI(object):
        root_lib = better_lib
        def fizzle(self, *args, **kwargs):
            return self.root_lib.better_fizzle(*args, **kwargs)
        def mundun(self, n, x, **kwargs):
            floof = (n, x)
            return self.root_lib.better_mundun(floof, **kwargs)
except ImportError:
    import worse_lib
    class LibAPI(object):
        root_lib = worse_lib
        def fizzle(self, x, y, z, **kwargs):
            fizz = self.root_lib.worse_fizz(x, y)
            return self.root_lib.izzle(fizz, z, **kwargs)
        def mundun(self, *args, **kwargs):
            return self.root_lib.worse_mundun(*args, **kwargs)
lib_api = LibAPI()

即使核心库可能完全不同,在您的代码中,您也可以以相同的方式与它们进行交互(lib_api.fizzle()lib_api.mundun()),因为您已经包裹了单个统一包装器中存在的任何差异。最好将所有这些都放在一个地方,而不是检查在整个代码中乱扔垃圾的各种位置中已导入哪个库。如果您绝对需要检查lib_api.root_lib是什么,您仍然可以内省使用哪个库。

最新更新