对于这种情况,我该如何拼写 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.Thing
或 stuff.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
.
我有这些 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.Thing
或 stuff.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
.