我在我的一个库中使用numpy
。这并不奇怪。
一个用户基本上会喜欢我的项目副本,我不会使用默认的numpy
,而是使用与autograd
捆绑在一起的版本。例如,让我说我有一个愚蠢的功能:
import numpy
def doSomething(x):
return numpy.sin(x)
他们想要一个库的副本,其中所有这些import numpy
都被from autograd import numpy
替换:
from autograd import numpy
def doSomething(x):
return numpy.sin(x)
这将使他们能够轻松计算我的函数的渐变和雅可比。
我想知道处理这个的最简单方法是不复制整个代码库并替换所有这些行。
我知道的选项:
我可以复制代码库(lib
和lib_autograd
),其中第一个使用import numpy
,第二个使用from autograd import numpy
。这很糟糕,因为那时我必须维护两个代码库。
如果可以,我可以从autograd
自动导入:
try:
from autograd import numpy
except ImportError:
import numpy
我不想这样做的原因是很多人都有高度优化的numpy
安装,而autograd
可能不会。所以我想给用户一个选项来导入哪个版本。强制用户使用autograd
版本,如果它们看起来很糟糕,因为它对用户来说不明显是什么,并且如果他们想要使用,则需要用户卸载autograd
具有默认numpy
安装的库。
那么我的选择是什么?
理想情况下会有一种方法可以将参数传递给import
语句(我确实知道你不能这样做):
useAutograd = False
from lib(useAutograd) import doSomething
答案 0 :(得分:3)
您可以使用以下方式进行'条件'导入:
try:
from autograd import numpy
except ImportError:
import numpy
其他选项之一是拥有环境变量,可以切换是否要使用numpy
中的autograd
或常规{/ 1}},因为您可以使用autograd.numpy
(如果存在)或numpy
。如果有numpy
模块/包,则无法使用autograd
。
详细说明如何为用户提供切换选项,这是一种可能性:
import os
if os.environ.get('AUTOGRADNUMPY'):
try:
from autograd import numpy
except ImportError:
import numpy
else:
import numpy
当您要从AUTOGRADNUMPY
包加载True
时,将环境变量numpy
设置为autograd
(或其他任何非空字符串)。如果未设置或不存在,则会导入常规numpy
。
如果用户至少安装了numpy
,则所有这些都会成立。
答案 1 :(得分:0)
这可能会有所帮助:
try:
from autograd import numpy as np
except ImportError:
import numpy as np
...
...
np.sum(..)