Python:仅在包存在时定义函数

时间:2015-09-05 14:49:40

标签: python

如果包存在,是否可以告诉Python 2.7仅解析函数定义?

我有一个在多台机器上运行的脚本。脚本中定义的某些函数非常好用,但脚本执行的核心操作并不是必需的。运行脚本的某些机器没有函数导入的软件包(并且软件包不能安装在它们上面)。目前,我必须在将repo克隆到这些机器上之前注释掉函数定义。另一种解决方案是维持两个不同的分支,但这更加乏味。有没有一种解决方案可以阻止我们在推送之前不断注释掉代码?

已经有调用函数的解决方案,例如:

try:
    someFunction()
except NameError:
    print("someFunction() not found.")

2 个答案:

答案 0 :(得分:11)

函数定义和导入只是Python中的代码,与其他代码一样,您可以将它们包装在try中:

try:
    import bandana
except ImportError:
    pass  # Hat-wearing functions are optional
else:
    def wear(hat):
        bandana.check(hat)
        ...

仅当wear模块可用时才会定义bandana函数。

这是否是一个好主意取决于你 - 我认为在你自己的脚本中会很好,但你可能不想在其他人会使用的代码中这样做。另一个想法可能是做这样的事情:

def wear(hat):
    try:
        import bandana
    except ImportError:
        raise NotImplementedError("You need the bandana package to wear hats")
    else:
        bandana.check(hat)
        ...

这样可以更清楚地说明为什么你不能使用wear函数。

答案 1 :(得分:0)

某种改进的解决方案如下: 在文件标题中:

try:
    # Optional dependency
    import psutil
except ImportError as e:
    psutil = e

稍后在函数开头或__init__方法内部:

if isinstance(psutil, ImportError):
    raise psutil
优点:访问可选功能时会收到原始异常消息。就像您只是做过import psutil