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

Python:仅当包存在时定义函数,python,Python,如果包存在,是否可以告诉Python2.7只解析函数定义 我有一个在多台机器上运行的脚本。脚本中定义了一些函数,这些函数非常好用,但脚本执行的核心操作并不需要这些函数。运行脚本的某些计算机没有函数导入的包(并且无法在其上安装该包)。目前,在将repo克隆到那些机器上之前,我必须注释掉函数定义。另一个解决方案是维护两个不同的分支,但这更加繁琐。有没有一种解决方案可以防止我们在推之前不断地注释掉代码 调用函数的时间已经有了解决方案,例如: try: someFunction() except

如果包存在,是否可以告诉Python2.7只解析函数定义

我有一个在多台机器上运行的脚本。脚本中定义了一些函数,这些函数非常好用,但脚本执行的核心操作并不需要这些函数。运行脚本的某些计算机没有函数导入的包(并且无法在其上安装该包)。目前,在将repo克隆到那些机器上之前,我必须注释掉函数定义。另一个解决方案是维护两个不同的分支,但这更加繁琐。有没有一种解决方案可以防止我们在推之前不断地注释掉代码

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

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

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

try:
    import bandana
except ImportError:
    pass  # Hat-wearing functions are optional
else:
    def wear(hat):
        bandana.check(hat)
        ...
仅当
bandana
模块可用时,这将定义
wear
功能

这是否是一个好主意取决于您——我认为在您自己的脚本中可以,但您可能不希望在其他人将使用的代码中这样做。另一个想法可能是这样做:

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

这将更清楚地说明为什么不能使用
磨损
功能。

稍微改进的解决方案如下: 在文件头中:

try:
    # Optional dependency
    import psutil
except ImportError as e:
    psutil = e
稍后在函数开头或
\uuuuu init\uuuu
方法中:

if isinstance(psutil, ImportError):
    raise psutil

优点:当您访问可选功能时,会收到原始异常消息。就像您只需导入psutil一样,为什么需要注释掉函数定义?如果这些函数不是必需的,但您还是定义了它们,这真的是个问题吗?回答得好!一旦我定义了它,我就可以在任何地方用
isinstance()确认它,这样我就不需要调用
try。。。一次又一次地捕捉…