在python

时间:2015-05-14 04:57:32

标签: python python-2.7 module

背景:

我正在写一个针对pypy的象征性包,用于表示表达式和获取衍生物。目前还没有进行简化或类似的工作,只是差异化和评估。

问题:

我正在编写表达式类来表示数学中的许多函数(sqrt,log,exp,sin,cos等)。我已将math中的模块命名为与您自然找到所述功能的模块一致。我将来可能会对cmath和任何其他具有特殊数学意义的模块做同样的事情。我的模块是更大的包ldb.algebra的一部分,因此名称math不会与基本命名空间中的任何内容发生冲突。但是,为了评估表达式,我需要在math模块中导入系统ldb.algebra.math模块,而我不能在math模块内部执行此操作(或者任何其他模块在同一级别的包装上。这是我到目前为止的基本路径:

ldb/
    __init__.py - empty
    algebra/
        __init__.py - empty
        math.py

ldb / algebra / math.py的内容作为问题的一个例子:

import math

my_sin = math.sin

显然不是非常有用,但它显示了这个想法。我正在使用python2(或者更喜欢python2的pypy)。我发现我可以通过创建一个子包,一个下面的模块sys_math,在该模块中导入math并暴露必要的函数来解决这个问题,但这看起来像很多工作和一个丑陋的混乱。

所以我的问题是:我是否可以进入系统math模块,同时还有一个名为ldb.algebra.math的模块?也许在__init__.py文件中有趣的事情就像使模块_math然后以某种方式更改__init__.py中的名称,或者某种特殊的方式来导入系统模块而不是我自己。

到目前为止我的丑陋解决方案:

ldb/
    algebra/
        extra_package/
            __init__.py - empty
            sys_math.py

sys_math.py的内容:

import math

sin = math.sin

1 个答案:

答案 0 :(得分:2)

from __future__ import absolute_import

将它放在模块的顶部以禁用隐式相对导入。然后import math将导入内置的math模块,如果您想使用相对导入,则必须使用from . import math等语法显式执行这些操作。