gpt4 book ai didi

Python 从模块导入函数两次,内部导入不同

转载 作者:行者123 更新时间:2023-11-28 21:38:01 25 4
gpt4 key购买 nike

我有一个模块 lib需要 numpy .因此,例如,假设我有一个看起来像

import numpy
def doSomething(x):
return numpy.sqrt(x)

现在要在单独的模块中使用该函数,我会将名称导入为

from lib import doSomething
...

这是棘手的部分...现在我想公开另一个版本的 doSomething为此 numpy已从另一个库导入(特别是从 autograd )。所以,例如,我希望能够有一个功能

from autograd import numpy
def doSomething(x):
return numpy.sqrt(x)

这些函数之间的唯一区别在于 numpy 在哪里正在从中导入。特别是,我想同时使用 doSomething 的两个版本。在相同的代码中,也就是说,我想要某种导入方式 doSomething两次...一次使用默认 numpy , 和一次 numpy来自 autograd。像这样:

useAutograd = False
from lib(useAutograd) import doSomething
useAutograd = True
from lib(useAutograd) import doSomething as doSomethingAutograd

据我所知,这里有几个选项,但没有一个令人满意。

  1. 我会复制一份代码库,并使用默认的 numpy , 和一个使用 numpy 的来自 autograd .这很糟糕,因为它需要我维护两个代码库,它们是彼此的副本,只是导入不同。

  2. 我可以放入条件导入:

    try:
    from autograd import numpy
    except ImportError:
    import numpy

    这很糟糕,因为用户无法控制导入哪个版本...如果他们有 autograd,那么他们必须使用那个版本。

  3. 我可以定义一个环境变量来控制导入

    import os
    if os.environ.get('AUTOGRADNUMPY'):
    try:
    from autograd import numpy
    except ImportError:
    import numpy
    else:
    import numpy

    缺点是虽然用户可以控制导入,但他们只能选择一个版本(据我所知)。所以他们不能在同一代码中使用这两个版本。

这个用例是否有更好的替代方案?

感兴趣的人的背景:

Autograd有自己的一套模仿 numpy 的功能并允许人们使用自动微分(与 tensorflow 相同)轻松计算导数,而不需要昂贵的数值微分。

但是,他们的 numpy 实现并不是最优化的版本 (AFAIK)。因此,允许用户使用带有 autograd 的版本将是有利的当他们需要函数的 jacobian 时导入,并在不需要时使用默认的、高度优化的 numpy 包。

最佳答案

如果您希望避免重复您的代码库,请将您的接口(interface)设为一个类。例如:

class using_numpy:
import numpy

@classmethod
def do_something(cls, x):
return cls.numpy.sqrt(x)

class using_autograd(using_numpy):
from autograd import numpy

现在 using_numpy.do_something 将使用 numpyusing_autograd.do_something 将使用 autograd.numpy

或者,如果您对 classmethod 感到不舒服,您可以将您的接口(interface)实例化为一个类,例如:

class interface:
def __init__(self, mdl):
self.mdl = mdl

def do_something(self, x):
return self.mdl.sqrt(x)

import numpy
import autograd

with_numpy = interface(numpy)
with_autograd = interface(autograd.numpy)

关于Python 从模块导入函数两次,内部导入不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48763957/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com