为何AppFilter(logging.basicConfig)中全局变量为空?如何解决?
为什么log.py中的MY_VARIABLE始终为空?如何解决?
问题原因
- 导入变量是复制而非引用:
main.py和log.py中使用from config import MY_VARIABLE时,会将config.py里MY_VARIABLE的当前值复制到各自模块的命名空间,两个模块的MY_VARIABLE是独立变量,修改其中一个不会影响另一个。 global关键字误用:main.py里的global MY_VARIABLE无效,因为MY_VARIABLE并非main.py自身定义的全局变量,而是从外部模块导入的,该声明无法修改config.py中的原变量。
解决方案
方法1:直接通过模块对象访问/修改变量(推荐)
放弃单独导入变量,改为导入整个config模块,所有操作直接针对模块内的原变量:
修改main.py:
from log import * import config for i in range(3): print(f"main.py Old: '{config.MY_VARIABLE}'") config.MY_VARIABLE = i print(f"main.py New: '{config.MY_VARIABLE}'") logging.info("The process is running...")
修改log.py:
import logging import config class AppFilter(logging.Filter): def filter(self, record): print(f"log.py MY_VARIABLE:{config.MY_VARIABLE}") record.my_variable = config.MY_VARIABLE return True logging.basicConfig( level=logging.INFO, format='%(asctime)s %(levelname)s (%(my_variable)s) > %(message)s', datefmt='%H:%M:%S' ) logging.getLogger('').addFilter(AppFilter())
方法2:用可变容器包装变量
将config.py中的变量放入可变容器(如字典),利用可变对象的引用共享特性实现同步:
修改config.py:
CONFIG = { 'MY_VARIABLE': '' }
修改main.py:
from log import * from config import CONFIG for i in range(3): print(f"main.py Old: '{CONFIG['MY_VARIABLE']}'") CONFIG['MY_VARIABLE'] = i print(f"main.py New: '{CONFIG['MY_VARIABLE']}'") logging.info("The process is running...")
修改log.py:
import logging from config import CONFIG class AppFilter(logging.Filter): def filter(self, record): print(f"log.py MY_VARIABLE:{CONFIG['MY_VARIABLE']}") record.my_variable = CONFIG['MY_VARIABLE'] return True logging.basicConfig( level=logging.INFO, format='%(asctime)s %(levelname)s (%(my_variable)s) > %(message)s', datefmt='%H:%M:%S' ) logging.getLogger('').addFilter(AppFilter())
内容的提问来源于stack exchange,提问作者Olga
相关产品推荐
相关产品推荐

