基于已安装模块编写条件语句的Python方式是什么?

时间:2019-08-05 15:02:21

标签: python conditional-statements

来自C ++世界,我习惯于基于标志来编写条件编译,这些标志是在编译时使用CMake等工具确定的。我想知道最模仿这种功能的Python方法是什么。例如,这是我当前根据是否找到模块设置的设置:

start_index = 0 
end_index = 15
forecast_index = 15
y = df.iloc[start_index:end_index] # end index in iloc is exclusive
model = auto_arima(y, ....)

# Predictions of y values based on "model", namely fitted values
yhat = model_fit.predict_in_sample(start=start_ind, end=end_ind - 1)

# One step forecast: forecast the element at index 15 
forecast = model_fit.predict(n_periods=1)

然后,我可以在其余的Python代码中使用import imp try: imp.find_module('petsc4py') HAVE_PETSC=True except ImportError: HAVE_PETSC=False 。这行得通,但是我想知道这是否是在Python中执行此操作的正确方法。

2 个答案:

答案 0 :(得分:7)

是的,可以。您甚至可以直接发出导入,并且 使用modulename本身作为标志-如:

try:
    import petsc4py
except ImportError
    petsc4py = None

在使用之前,只需测试petsc4py本身的真实性即可。

实际上,由于存在冗余,因此检查它是否存在,然后再尝试将其导入,就感觉异常了,因为这两个操作均会触发ImportError。但是使用HAVE_PETSC进行检查是可以的-可以在上述try / except之后使用HAVE_PETSC = bool(petsc4py)

创建它

答案 1 :(得分:0)

您的操作方式或多或少都很好。实际上,Python标准库使用类似的范式“尝试导入某些内容,如果由于某种原因它无效,则以某种方式设置变量” in multiple places。检查程序后面是否设置了布尔值比每次单独尝试try / except块要快。

对于您而言,这样做可能会更好,但是:

try:
    import petsc4py
    HAVE_PETSC = True
except ImportError:
    HAVE_PETSC = False

您所拥有的都是范例级别的,但是在这种情况下,没有真正的理由要经过importlib(而且您可能不应该使用imp,因为它在最近的版本中已经过时了) python)。