我的软件包包含几个模块config
和logging
(以及其他模块)。
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()
可用?
如果不这样,有没有更简洁的方法我可以设计这个没有这个问题?
答案 0 :(得分:1)
要使当前代码生效,您可以在config.log_file
函数中导入log
:
def log(message):
from mypackage.config import log_file
open(log_file, "a").write(message + "\n")
当然,您有很多可能重新设计整个系统。
例如,您可以将所有可以产生循环依赖关系的设置放入他们自己的配置文件中,并从logging.py
和config.py
导入。