我可能只是与Python的思维方式不一致,但对我来说,当涉及到一个包(或任何项目文件夹系统)时,包的内容应总是更多比该软件包之外的任何重要,包括PYTHONPATH
。
以此层次结构为例:
somewhere/
foo/
__init__.py
bar/
__init__.py
foo/
__init__.py
如果somewhere
位于PYTHONPATH
,此处没有其他内容,而somewhere/bar/__init__.py
我做了一个简单的import foo
,我觉得bar
应导入其中子路径somewhere/bar/foo
,而不是路径变量中的陌生人somewhere/foo
。如果你在自己的系统内找不到合适的东西,那么路径应该就在你的位置。
在我的测试中,似乎PYTHONPATH
胜过直接后代,这将是一种耻辱,因为它是一个功能较弱,灵活性较低的系统,并且它不能正确地遵循层次结构的DAG性质。儿童先到先得,而不是兄弟姐妹,当然也不是祖先或完全无关系。但是,当我删除PYTHONPATH
时,会突然使用foo
内的bar
。
我只是做错了什么,或者Python真的以这种方式工作?有什么我可以做的让它按照我认为应该的方式工作吗?如果我删除somewhere/bar/foo
,然后它可以查看路径,但如果我明确地在foo
中放置bar
,那么它应该使用它,就像实例变量将覆盖类变量。
答案 0 :(得分:0)
PEP 238是关于绝对和相关的进口。
据我了解,from . import bar
会输入正确的内容。阅读PEP可以帮助您了解导入模块的不同方法。
他们指出,absolut导入是默认导入,因为它可以用于所有事情:
import foo
import bar.foo
import sys
与之相反:
import ..foo
import .foo
import sys #absolute