【问题标题】:How to access a standard-library module in Python when there is a local module with the same name?当有同名的本地模块时,如何在 Python 中访问标准库模块?
【发布时间】:2010-12-26 09:22:52
【问题描述】:

当文件 prog.py 与同名的本地模块 (math.py) 放在同一目录中时,如何访问标准库模块(比如 math)?

我问这个问题是因为我想创建一个可以用作的包uncertainties

import uncertainties
from uncertainties.math import *

因此,不确定性目录中有一个本地数学模块。问题是我想从不确定性/__init__.py 访问标准库数学模块。

我不想重命名不确定性.math,因为这个模块正是为了替换数学模块中的函数(使用处理数值不确定性的等效函数)。

PS:这个问题与我为执行calculations with uncertainties 而编写的模块有关,同时考虑了变量之间的相关性。

【问题讨论】:

    标签: python import module standard-library


    【解决方案1】:

    您正在寻找来自PEP 328 的绝对/相对导入,可通过2.5 and upward 获得。

    在 Python 2.5 中,您可以使用 from __future__ import absolute_import 指令将 import 的行为切换为绝对导入。这种绝对导入行为将成为未来版本(可能是 Python 2.7)中的默认行为。一旦绝对导入成为默认值,导入数学将始终找到标准库的版本。建议用户应尽可能开始使用绝对导入,因此最好在代码中从 pkg 导入字符串开始编写。

    在使用 from ... 导入形式时,仍然可以通过在模块名称中添加前导句点来进行相对导入:

    from __future__ import absolute_import
    # Import uncertainties.math
    from . import math as local_math
    import math as sys_math
    

    【讨论】:

    • 验证为答案:这回答了问题(尽管 S. Lott 说服我应该走另一条路 :)。
    • 是的,我也不会使用数学作为模块名称;)
    • “可能在 2.7 中” - 实际上从未发生过。 2.7 用户如果想要这种行为,需要 absolute_import 行。
    【解决方案2】:

    为什么不能再次重命名本地模块?

    显然,如果您仍然需要已安装的 uncertainties 中的东西,这不是“完全”替代品。

    因为它是部分替换,所以你不应该给它同样的名字。

    有什么不同?有什么相同的?在此基础上选择一个更好的名称。

    【讨论】:

    • +1:授予,它不是完全替代品。我将考虑重命名(未来的)不确定性.math 模块。 PS:在不确定性.py 中使用了标准数学模块,因为不确定性是通过不知道不确定性的数学函数来操纵的(可以使用不确定性.math 模块,但会以速度为代价,因为它比标准数学模块更通用)
    • @EOL:你不能简单地用另一个同名模块替换像“数学”这样基本的东西。时期。这让用户感到困惑。尽管您希望提供平稳的“针对针”替换,但不要这样做。请不要。称它为“umath”或明确声明它不是math
    • @S. Lott:是的,我原以为import uncertainties.mathfrom uncertainties import math 一样清晰,但我没有看到math.sin() 会令人困惑。我会以你的名义将它命名为 umath。 :)
    • @EOL:例如,查看 Python 的 urlliburllib2。而不是尝试更换;他们提供了一个新名称,明确分开。
    猜你喜欢
    • 1970-01-01
    • 2021-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    • 2022-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多