我在一个项目中遇到了一个性能问题,我把它缩小到了一些日志(log)行.即使我的日志(log)记录设备高于正在记录的行的级别,f字符串似乎也会被计算出来.

考虑这个例子来证明这个问题:

import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger('MyLogger')

class MyClass:
    def __init__(self, name: str) -> None:
        self._name = name
    def __str__(self) -> str:
        print('GENERATING STRING')
        return self._name

c = MyClass('foo')
logger.debug(f'Created: {c}')

当这个例子运行时,我会在屏幕上打印"生成字符串",表明正在运行__str__方法,即使我的日志(log)级别设置为INFO,日志(log)行为DEBUG.

从我今天所知道的,解决方案是使用下面的vs f字符串.

logger.debug('Created: %s', c)

我现在脑子里有三件事.

  • 我读到的大多数例子和文档似乎都很旧.
  • 此项目仅限于Python 3.7+(不担心向后兼容).
  • 我有很多代码需要更新.

我很想知道其他人在这种情况下会怎么做.%s是最好(最现代)的方法吗?是否有一种更现代的方式可以像上面演示的那样记录日志(log)?

我有很多代码需要更新(修复),我希望与现代最佳实践保持一致.

推荐答案

在我看来,在字符串中使用%s并不是最现代的方法.当然,大多数开发人员会更喜欢使用f字符串,因为它更方便、更易于读取(和写入).

但是,有趣的是,您会发现一个特定的情况,您可能不想使用f字符串.如果由于优化问题需要避免自动调用__str__()方法,那么使用%s而不是f字符串可能是一个很好的理由.但是,这也可能表明您的程序中可能会采取一些措施来降低__str__()的复杂性.大多数情况下,计算对象的字符串表示形式不应该花费太多时间或资源...

Python-3.x相关问答推荐

如何创建多个日志(log)文件

数组列的极点成对求和

Python - 根据条件附加 NULL 值

链接列未延伸到数据框的末尾

torch.stack([t1, t1, t1], dim=1)与torch.hstack([t1, t1, t1])之间有什么区别?

从 LeetCode 的 Python 解决方案类中理解关键字 self

如何在 histplot 中标记核密度估计

过滤列表中的所有字典以使用特定键并忽略其他键?

txt 文件与不同的分隔符到整数列表

Pandas 在每组两个条件之间获得时间增量

Python BeautifulSoup:在 Select 语句中排除其他标签

Semaphore信号量 Python 的工作原理

在python中循环处理时并行写入文件

str.format_map(mapping) 和 str.format 有什么区别

Python图例属性错误

aiohttp+sqlalchemy:在回滚无效事务之前无法重新连接

python 内置的 __exit__ 参数类型是什么?

如何在 Selenium 和 Python 中使用类型查找元素

带有数千个逗号刻度标签的 MatPlotLib 美元符号

新项目:Python 2 还是 Python 3?