带参数

时间:2018-02-12 10:30:19

标签: python python-import

我在我的一个库中使用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)

这将使他们能够轻松计算我的函数的渐变和雅可比。

我想知道处理这个的最简单方法是不复制整个代码库并替换所有这些行。

我知道的选项:

  1. 我可以复制代码库(liblib_autograd),其中第一个使用import numpy,第二个使用from autograd import numpy。这很糟糕,因为那时我必须维护两个代码库。

  2. 如果可以,我可以从autograd自动导入:

    try:
        from autograd import numpy
    except ImportError:
        import numpy
    

    我不想这样做的原因是很多人都有高度优化的numpy安装,而autograd可能不会。所以我想给用户一个选项来导入哪个版本。强制用户使用autograd版本,如果它们看起来很糟糕,因为它对用户来说不明显是什么,并且如果他们想要使用,则需要用户卸载autograd具有默认numpy安装的库。

  3. 那么我的选择是什么?

    理想情况下会有一种方法可以将参数传递给import语句(我确实知道你不能这样做):

    useAutograd = False
    from lib(useAutograd) import doSomething
    

2 个答案:

答案 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(..)