我有这些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.Thing
或stuff.Thing
我该怎么做?
答案 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
。