【问题标题】:How to logging.debug with an operator?如何使用操作员进行 logging.debug?
【发布时间】:2018-05-01 20:12:03
【问题描述】:

我一直在尝试停止使用打印语句进行调试并开始使用 logging.debug。我可以在打印中使用运算符,但日志记录似乎不一样。

例如,这是可行的

print('Is between now and then:    ', solar_noon < now < solarnoonplustimeunit )

这不是。

logger.debug('Is between now and then:    ', solar_noon < now < solarnoonplustimeunit )

后者说:

Traceback (most recent call last):
  File "/usr/lib/python2.7/logging/__init__.py", line 859, in emit
    msg = self.format(record)
  File "/usr/lib/python2.7/logging/__init__.py", line 732, in format
    return fmt.format(record)
  File "/usr/lib/python2.7/logging/__init__.py", line 471, in format
    record.message = record.getMessage()
  File "/usr/lib/python2.7/logging/__init__.py", line 335, in getMessage
    msg = msg % self.args
TypeError: not all arguments converted during string formatting

我应该如何对日志进行操作员测试?

【问题讨论】:

  • 第一个参数是一个格式字符串。尝试在末尾添加%s

标签: python logging printing operator-keyword


【解决方案1】:

日志记录模块方法期望第一个参数是格式字符串,以下参数属于该格式字符串:logger.debug(fmt_str, arg1,....)。但是您的字符串没有任何迹象表明后面还有更多元素。

即logger.debug 函数最终会尝试做这样的事情:

fmt_str % (arg1, arg2, ...)


尝试只添加格式 str %s:

logger.debug('Is between now and then:    %s', solar_noon < now < solarnoonplustimeunit )


编辑: 为什么您的原始字符串适用于 print

根据docs

print(*objects, sep=' ', end='\n', file=sys.stdout)

将对象打印到流文件中,以 sep 分隔,后跟 end。 sep、end 和 file(如果存在)必须作为关键字参数给出。

所有非关键字参数都转换为字符串,如 str() 和 写入流,以 sep 分隔,后跟 end。两个九月 end 必须是字符串;它们也可以是 None,这意味着使用 默认值。如果没有给出对象,print() 将只写 end。

由于默认的sep 是一个空格,python 只是将你的字符串和布尔值的字符串表示形式混合在一起,用空格分隔它们。

【讨论】:

  • 我猜 Print 假定一个字符串并打印它?
  • @Rich -- 在我的回答中添加了对print 行为的解释
猜你喜欢
  • 2011-12-25
  • 2010-12-16
  • 2016-08-21
  • 2022-01-12
  • 2014-05-30
  • 2018-01-14
  • 2020-09-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多