假设我正在构建一个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
是什么,您仍然可以内省使用哪个库。