gpt4 book ai didi

具有相同名称的 Python 模块(即,在包中重用标准模块名称)

转载 作者:太空狗 更新时间:2023-10-29 17:13:01 25 4
gpt4 key购买 nike

假设我有一个包含模块的包:

SWS/
__init.py__
foo.py
bar.py
time.py

并且模块需要引用彼此包含的函数。我的 time.py 模块似乎遇到了问题,因为有一个同名的标准模块。

例如,如果我的 foo.py 模块需要我的 SWS.time 和标准的 python time 模块,我遇到麻烦,因为解释器会查看包内部并在遇到标准 time 模块之前找到我的 time.py 模块。

有什么办法解决这个问题吗?这是一个禁忌的情况吗?模块名称是否应该不被重用?

任何关于包哲学的解决方案和意见在这里都会有用。

最佳答案

重用标准函数/类/模块/包的名称从来都不是一个好主意。尽量避免它。但是,对于您的情况,有一些干净的解决方法。

您看到的行为是导入 SWS.time 而不是 stdlib time,这是由于古代 python 中 import 的语义所致版本(2.x)。要修复它,请添加:

from __future__ import absolute_import

在文件的最顶部。这会将 import 的语义更改为 python3.x 的语义,后者更加明智。在那种情况下声明:

import time

只会引用顶级模块。因此解释器在包内执行该导入时不会考虑您的 SWS.time 模块,但它只会使用标准库。

如果您的包的模块需要导入SWS.time,您可以选择:

  • 使用显式相对导入:

    from . import time
  • 使用绝对导入:

    import SWS.time as time

所以,你的 foo.py 应该是这样的:

from __future__ import absolute_import

import time

from . import time as SWS_time

关于具有相同名称的 Python 模块(即,在包中重用标准模块名称),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10501473/

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