另一个绝对的进口问题

时间:2009-08-11 23:10:07

标签: python

我遇到的问题是我自己的模块覆盖内置的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发行说明,发现绝对导入非常简单。不幸的是我无法弄明白这一点。

我在这里缺少什么?

2 个答案:

答案 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)

您可以使用relative imports强制python首先查找模块的位置:

in package/__init__.py

from . import logging