对于这种情况,我该如何拼写 Python package/module 导入?

How do I spell Python package/module imports for this situation?

我有这些 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: module 'foo.stuff' has no attribute 'Thing'

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

我该怎么做?

添加 __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 属性应该解析(它是一个 class)并且 stuff.Thing 属性应该解析(它是一个子模块)。

注意: 在同一项目中让模块名称与 class 相匹配并不是一个好的命名约定 - 这会造成不必要的混淆。我建议将 "functions related to Thing" 的 Thing 子模块重命名为其他名称,例如 thing_helpers.