在 python 中导入系统模块

Importing system modules in python

背景:

我正在编写一个针对 pypy 的符号包,用于表示表达式和取导数。目前不致力于简化或类似的事情,只是差异化和评估。

问题:

我正在编写表达式 类 来表示数学中的许多函数(sqrt、log、exp、sin、cos 等)。我已将此模块命名为 math 以与您自然找到所述功能的模块一致。我将来可能会对 cmath 和任何其他特别感兴趣的数学模块做同样的事情。我的模块是更大包 ldb.algebra 的一部分,因此名称 math 不会与基本名称空间中的任何内容发生冲突。但是,为了计算表达式,我需要在 ldb.algebra.math 模块中导入系统 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 并公开必要的功能,但这似乎需要很多工作并且丑陋的混乱。

所以我的问题是: 我可以在仍然有一个名为 ldb.algebra.math 的模块的情况下访问系统 math 模块吗?也许 __init__.py 文件中有些有趣的东西,比如制作模块 _math 然后以某种方式更改 __init__.py 中的名称,或者以某种特殊方式导入系统模块而不是我自己。

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

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

sys_math.py 的内容:

import math

sin = math.sin
from __future__ import absolute_import

将它放在模块的顶部以禁用隐式相对导入。然后 import math 将导入内置的 math 模块,如果你想使用相对导入,你必须使用 from . import math.

这样的语法显式地执行它们