来自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中执行此操作的正确方法。
答案 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)。