0

我可能只是在这里与 Python 的思维方式不一致,但对我来说,当涉及到包(或任何项目文件夹系统)时,包的内容应该总是比包之外的任何东西更重要,包括PYTHONPATH.

以这个层次结构为例:

somewhere/
    foo/
        __init__.py
    bar/
        __init__.py
        foo/
            __init__.py

如果somewhere是 in PYTHONPATH,而这里没有其他内容,并且在somewhere/bar/__init__.py我做一个简单的import foo,我觉得应该从路径变量中bar导入它的孩子,somewhere/bar/foo而不是一个完全陌生的人。somewhere/foo如果您在自己的系统中找不到正确的东西,路径应该是您要去的地方。

然而,在我的测试中,它似乎PYTHONPATH胜过直系后代,这将是一种耻辱,因为它是一个不那么强大、不那么灵活的系统,并且它没有正确地尊重层次结构的 DAG 特性。孩子排在第一位,不是兄弟姐妹,当然也不是祖先或完整的非亲属。但是,当我删除时PYTHONPATH,它突然使用了foo里面bar

我只是做错了什么,还是 Python 真的以这种方式工作?我能做些什么让它按照我认为的方式工作吗?如果我删除somewhere/bar/foo那么它可以在路径中查找,但如果我明确地将 a fooin bar,那么它应该使用它,就像实例变量将覆盖类变量一样。

4

1 回答 1

0

PEP 238是关于绝对和相对导入的。

据我了解,from . import bar会导入正确的东西。阅读该 PEP 可以帮助您了解导入模块的不同方式。

他们指出,绝对导入是默认的,因为它可以用于所有事情:

import foo
import bar.foo
import sys

对比:

import ..foo
import .foo
import sys #absolute
于 2013-09-04T09:12:21.927 回答