python - 字典中的代码在没有被调用的情况下运行
问题描述
我正在创建一个日志功能,并使用字典来确定日志级别。但是,字典中的值(代码)在没有调用它的情况下运行。
def debug(level = 0, text = ''):
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
Formatter = logging.Formatter('%(asctime)s %(levelname)-8s %(message)s', datefmt = '%Y-%m-%d %H:%M:%S')
fileLog = logging.FileHandler('test.log')
fileLog.setLevel(logging.DEBUG)
fileLog.setFormatter(Formatter)
logger.addHandler(fileLog)
streamLog = logging.StreamHandler()
streamLog.setLevel(logging.DEBUG)
streamLog.setFormatter(Formatter)
logger.addHandler(streamLog)
log = str(sys._getframe(1).f_code.co_name + " " + text)
logLevel = {
0: logger.debug(log),
1: logger.info(log),
2: logger.warning(log),
3: logger.error(log),
4: logger.critical(log)
}
logLevel.get(level, None)
def test():
debug(0, "MESSAGE")
我该如何解决这个问题?
解决方案
必须在创建字典之前评估字典的值。没有办法解决这个问题。
您可以做的是将值包装在一个函数中,然后稍后调用该函数:
logLevel = {
0: lambda: logger.debug(log),
1: lambda: logger.info(log),
2: lambda: logger.warning(log),
3: lambda: logger.error(log),
4: lambda: logger.critical(log)
}
log_f = logLevel[1]
log_f() # Will call the "lambda: logger.info(log)" function.
这些值仍在评估中,但现在评估的是函数,而不是它包含的代码。
这也可以通过使用来实现functools.partial
from functools import partial
logLevel = {
0: partial(logger.debug, log),
1: partial(logger.info, log),
2: partial(logger.warning, log),
3: partial(logger.error, log),
4: partial(logger.critical, log)
}
log_f = logLevel[1]
log_f()
关键是需要延迟执行,而函数包装器是实现这一目标的最简单(但不一定是唯一的选择)。
推荐阅读
- java - 重命名顶级文件夹后如何在 intelli j 中重建项目模块?
- css - 使用 css 更改 svg 路径
- node.js - 将 Socket.IO 用于聊天应用程序,但 MongoDB/Mongoose 仅用于用户
- go - 需要运行几个 func() bool 并得到第一个 false
- javascript - 返回前如何格式化数据json?
- css - 带有 translateZ 的 CSS 透视图在 Safari 上不起作用
- python - 如何评估包含熊猫列表的列?
- r - 用于逻辑回归的亚组分析的森林图类似于 r 中的 NEJM 图
- html - 如果任何单元格值在角度中为空,如何隐藏整行
- oracle - 在远程 Windows 主机上通过 SQLcl 启动 oracle .sql 脚本