Python 导入系统,从一个模块导入功能,该模块从另一个包导入相同的功能

Python Import system, importing function from a module that imports the same function from another package

遇到具有以下结构的代码:

/root
  /app
    __init__.py
    mod1.py
    mod2.py
  /lib
    __init__.py
    libmod.py

mod1:

from lib.libmod import somefunc

mod2:

from app.mod1 import somefunc

虽然这没有运行时错误,但我的直觉告诉我 mod2 应该从 lib 中导入 somefunc。我对 python 导入系统了解有限,但我很担心导入 imports/code 运行 两次或对 namespaces.Should 进行某种污染 我很担心,或者这完全没问题 Python?

这很好。 from x import name 语句仅从 x 导入 name——它不关心 name 最初定义的位置。

事实上,标准库本身经常从内部或 C 模块中重新导出名称。

# collections/abc.py
from _collections_abc import *
from _collections_abc import __all__
from _collections_abc import _CallableGenericAlias

重新导出名称有助于使包的外观 public 更易于使用,同时完全自由地构建实施方式。

但是,在 across 包中重新导出名称时应该小心。仅仅因为一个包今天公开了一个名字并不意味着未来的版本也会这样做。当中间包不受您控制时,请避免做出假设,并希望从官方来源导入。

# bad: import undocumented attribute
from subprocess import os
# good: import with official name
import os

定义对象的“位置”的概念通常没有意义。例如,考虑为文字常量定义一个模块:

# constants.py
MIDNIGHT = 0
NOON = 12 

在整个应用程序中,每个 012 都有一个值。语句 from constants import MIDNIGHT, NOON 无法检查对象最初定义的位置。