在这种情况下,如何拼写Python包/模块导入?

时间:2018-06-21 14:27:24

标签: python python-packaging

我有这些Python文件

project/packages/foo/job.py
project/packages/foo/models.py
project/packages/foo/stuff/Thing.py

models.py包含class Thing,而Thing.py包含与Thing相关的功能

job.py尝试这样做:

from . import models
from . import stuff

def job ():
    x = models.Thing (123)
    stuff.Thing.related_function (x)

这会产生错误:

  

AttributeError:模块'foo.stuff'没有属性'Thing'

我已经尝试了导入拼写的变体,但无法使其正常工作。我不想Thing带入命名空间,但始终必须将其称为models.Thingstuff.Thing

我该怎么做?

1 个答案:

答案 0 :(得分:0)

添加__init__文件:

project/packages/foo/__init__.py
project/packages/foo/job.py
project/packages/foo/models.py
project/packages/foo/stuff/__init__.py
project/packages/foo/stuff/Thing.py

stuff包中,通过添加以下行来初始化子模块:

# in project/packages/foo/stuff/__init__.py file
from foo.stuff import Thing

另一个__init__.py可以为空。

现在在您的job.py代码中,models.Thing属性应该可以解析(它是一个类),而stuff.Thing属性应该可以解析(它是一个子模块)。

注意:在同一个项目中,具有与该类匹配的模块名称并不是一个好的命名约定,这不必要地造成混淆。我建议将“与Thing相关的功能”的Thing子模块重命名为其他名称,例如thing_helpers