如果包存在,是否可以告诉Python 2.7仅解析函数定义?
我有一个在多台机器上运行的脚本。脚本中定义的某些函数非常好用,但脚本执行的核心操作并不是必需的。运行脚本的某些机器没有函数导入的软件包(并且软件包不能安装在它们上面)。目前,我必须在将repo克隆到这些机器上之前注释掉函数定义。另一种解决方案是维持两个不同的分支,但这更加乏味。有没有一种解决方案可以阻止我们在推送之前不断注释掉代码?
已经有调用函数的解决方案,例如:
try:
someFunction()
except NameError:
print("someFunction() not found.")
答案 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