使模块部分导入

时间:2016-12-13 01:53:43

标签: python import circular-dependency

我的软件包包含几个模块configlogging(以及其他模块)。

logging模块提供了一种记录包日志文件的方法(在config模块中定义)。

config模块包含一堆静态配置值(硬编码)以及从文件加载的一些动态配置值。

mypackage/logging.py

import mypackage.config

def log(message):
    log_file = mypackage.config.log_file
    open(log_file, "a").write(message + "\n")

mypackage/config.py

import mypackage.logging

log_file = "/var/log/mypackage.log"

try:
    # Load some more config from file.
except Exception as e:
    # That's fine, just log that we couldn't open the file.
    mypackage.logging.log("Couldn't open config file: %s" % str(e))

问题是上面的代码遇到循环依赖问题,在导入完成之前从mypackage.logging.log()调用mypackage/config.py意味着log_file = mypackage.config.log_file中的mypackage/logging.py行会失败。

是否可以将mypackage/config.py的静态部分导入模块,以便在mypackage.config.log_file被调用时mypackage.logging.log()可用?

如果不这样,有没有更简洁的方法我可以设计这个没有这个问题?

1 个答案:

答案 0 :(得分:1)

要使当前代码生效,您可以在config.log_file函数中导入log

def log(message):
    from mypackage.config import log_file
    open(log_file, "a").write(message + "\n")

当然,您有很多可能重新设计整个系统。 例如,您可以将所有可以产生循环依赖关系的设置放入他们自己的配置文件中,并从logging.pyconfig.py导入。