【问题标题】:In general, should I write multiple versions of a code body in case a user is missing packages?一般来说,如果用户缺少包,我应该编写多个版本的代码主体吗?
【发布时间】:2016-12-21 20:48:10
【问题描述】:

假设我正在构建一个 Python 程序,一开始我导入了两个模块 - something(默认包含在 python 库中)和 somethingElse,不是。

我有两个几乎相同的功能,一个可以在没有 somethingElse 的情况下工作,另一个版本可以更好地使用它。虽然理想情况下,人们只会安装所需的依赖项,但我更喜欢那些机器/系统与 somethingElse 包不兼容的用户可以访问。 例子:

try:
   import something
   import somethingElse
except ImportError:
   import something

if not ImportError:
   versionA()

else:
   versionB()

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

谢谢!

【问题讨论】:

    标签: python error-handling runtime-error


    【解决方案1】:

    一般来说,最好有一个处理依赖关系的 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 是什么来反省使用了哪个库。

    【讨论】:

    • 不错!我本来打算建议猴子修补,但这样更好。
    猜你喜欢
    • 1970-01-01
    • 2017-07-17
    • 2017-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-29
    • 2013-04-05
    相关资源
    最近更新 更多