我遇到的问题是我自己的模块覆盖内置的Python模块(特别是日志记录模块)。这是我的项目布局:
run.py
package/
__init__.py
logging/
__init__.py
...
run.py
from package import main
main()
包/ __初始化__。PY
from __future__ import absolute_import
import logging
import logging.config
def main():
logging.config.fileConfig(...)
包/记录/ __初始化__。PY
class Logging(object):
pass
现在看来,上面的代码是有效的。一旦我尝试从package.logging导入Logging类,就像这样:
from __future__ import absolute_import
import logging
import logging.config
from package.logging import Logging
def main():
logging.config.fileConfig(...)
我收到错误:
AttributeError: 'module' object has no attribute 'config'
我已阅读PEP 328发行说明,发现绝对导入非常简单。不幸的是我无法弄明白这一点。
我在这里缺少什么?
答案 0 :(得分:9)
相对和绝对进口(PEP 328)不是问题。
当导入包中的模块时,会将其隐式添加到此包的命名空间中。所以
from package.logging import Logging
不仅会将'Logging'添加到package。 _dict _,还会将'logging'(新导入的本地模块)添加到package。 _dict _。因此,您首先导入日志记录(顶级模块),它可以作为package.logging使用,然后使用本地模块覆盖此变量。这基本上意味着您无法按预期方式使用package.logging来访问顶级模块和本地模块。
在这种特定情况下,您可能不希望将顶级日志记录模块“导出”为公共名称。而是做:
from logging import config as _config
def main():
_config.fileConfig(...)
答案 1 :(得分:1)