Python设计模式Logger类调用报错求助:TypeError参数缺失
TypeError: Logger.info() 缺少必要参数'msg'的解决方法
问题重现
运行new_script_with_logger.py时触发以下错误:
Traceback (most recent call last): File "C:\Users\Python Design Pattern\Practical_Design\Practical_Python_Design_PaTTERN\new_script_with_logger.py", line 4, in <module> logger_object.info('this is an info message') TypeError: Logger.info() missing 1 required positional argument: 'msg'
相关代码:
logger_class.py
class Logger(object): """A file-based message logger with the following properties Attributes: file_name: a string representing the full path of the log file to which this logger will write it messages """ def __init__(self, file_name): """Return a logger object whose file_name is * file_name*""" self.file_name = file_name def _write_log(self, level, msg): """Writes a message to the file_name for a specific Logger instance""" with open(self.file_name, 'a') as log_file: log_file.write('[{0} {1}\n'.format(level, msg)) def critical(self, level, msg): self._write_log('CRITICAL', msg) def error(self, level, msg): self._write_log(self, level, msg) def warn(self, level, msg): self._write_log('WARN', msg) def info(self, level, msg): self._write_log('INFO', msg) def debug(self, level, msg): self._write_log('DEBUG', msg)
new_script_with_logger.py
from logger_class import Logger logger_object = Logger('/var/log/class_logger.log') logger_object.info('this is an info message')
运行命令:
python new_script_with_logger.py
错误分析
- 日志方法参数冗余:
info、critical、warn、debug、error这些方法被错误定义了level参数。实际上每个方法对应固定的日志级别(比如info对应'INFO'),只需要接收日志内容msg即可。调用时只传了msg,但方法要求两个参数,因此触发TypeError。 - error方法调用错误:
error方法调用_write_log时多传了self,导致_write_log接收到的参数数量不匹配(原本只需要level和msg,现在传入了self、level、msg三个参数)。
修正方案
修改logger_class.py中的日志方法,去掉冗余的level参数,并修正error方法的调用:
class Logger(object): """A file-based message logger with the following properties Attributes: file_name: a string representing the full path of the log file to which this logger will write it messages """ def __init__(self, file_name): """Return a logger object whose file_name is * file_name*""" self.file_name = file_name def _write_log(self, level, msg): """Writes a message to the file_name for a specific Logger instance""" with open(self.file_name, 'a') as log_file: log_file.write('[{0} {1}\n'.format(level, msg)) def critical(self, msg): self._write_log('CRITICAL', msg) def error(self, msg): self._write_log('ERROR', msg) def warn(self, msg): self._write_log('WARN', msg) def info(self, msg): self._write_log('INFO', msg) def debug(self, msg): self._write_log('DEBUG', msg)
修正后,new_script_with_logger.py的调用方式保持不变,即可正常运行,将日志写入指定文件。
内容的提问来源于stack exchange,提问作者Kram R
相关产品推荐
相关产品推荐

