Python 第三方打印库介绍 -- LK Logger

news/2025/2/9 7:49:33/

lk-logger 是一个增强型的打印库, 它被设计为能直接替换 python 内置的 print 函数, 在此之上提供两个对开发者更友好的功能:

  • 在打印内容时, 同时打印出源码所在文件行号
  • 通过一些预设的标记, 打印具有高亮效果或特定格式的文本

下面的两张图直观地说明 printlk-logger 的打印效果区别:

安装和使用

通过 pip 安装, 支持 python 3.8 及以上版本:

pip install lk-logger

使用方法很简单, 在主入口文件添加下面两行代码, 则全部脚本都会生效:

python"># main.py# add two lines to import & setup lk-logger
import lk_logger
lk_logger.setup()# now it effects
print('hello world')
#   ./main.py:8  >  hello world

以上, 几乎就是 lk-logger 的全部用法.

更多用法

显示变量名

import lk_logger
lk_logger.setup(show_varnames=True)
#               ^^^^^^^^^^^^^^^^^^
a = 1
b = 2
print(a, b, a + b)

设置 setup 函数传参 show_varnames=True, lk-logger 会检测源代码中的变量名, 伴随值一同打印出来:

它的效果类似于 print(f'a = {}; b = {}; a + b = {}'.format(a, b, a + b)), 但明显地书写要简洁得多.

美化来自第三方库的打印

假设导入的第三方库 (比如 “site-packages” 目录下的第三方包) 也用了 print 代码, lk-logger 会缩写源文件路径, 并以其他颜色高亮显示库名称:

import lk_logger
lk_logger.setup(quiet=True, show_varnames=True)import depsland  # pip install depsland
# ^ there are some prints in depsland initial time.
#   let's see the print results.
print(depsland.__version__)

高亮文本

下面是一部分常见的高亮效果示例, 完整的语法标记表在后面的 “标记语法” 一节给出.

import lk_logger
lk_logger.setup(quiet=True)print('[red]hello[/] [yellow]world[/]', ':r')
# ^ notice ':r' mark, we'll explain later.print(':d', 'divider line')# verbosities
print(':v0', 'debug')
print(':v1', 'info (dimmed)')
print(':v2', 'info')
print(':v3', 'success (dimmed)')
print(':v4', 'success')
print(':v5', 'warning (dimmed)')
print(':v6', 'warning')
print(':v7', 'error (dimmed)')
print(':v8', 'error')

异常处理

lk-logger 依赖 rich 库, 后者提供了漂亮的异常信息界面:

import lk_logger
lk_logger.setup(quiet=True)
# try to raise an error
x = 1 / 0

在 IPython 中使用

lk-logger 在 ipython 中对效果进行了一些调整, 减少了信息的干扰, 以适应 ipython 的使用场景.

该功能是自动的, 不需要在代码中额外添加参数.

计时和计数

这里会用到 “标记用法”, 关于标记语法会在后续章节详细说明, 下面仅作效果展示:

import lk_logger
lk_logger.setup(quiet=True)print(':d', 'indexing')
print(':i', 'aaa')
print(':i', 'bbb')
print(':i', 'ccc')
print(':i0', 'reset counter')
print(':i', 'ddd')
print(':i', 'eee')
print(':i', 'fff')print(':d', 'timing')
from time import sleep
sleep(0.1)
print(':t', '... in a short delay')
sleep(1)
print(':t', '... in a little long delay')
sleep(5)
print(':t', '... in a long delay')

进阶用法

反射源码层级

默认情况下, lk-logger 打印的是当前的源码所在的文件行号. 有时候我们会想打印源码的上一层级 (frame), 以便了解是谁在调用当前模块.

假设有一个函数叫 “借阅图书”, 当这个函数被调用时, 我们想知道是谁在借阅图书 (也就是打印借阅者所在的文件行号), 可以这样做:

import lk_logger
lk_logger.setup(quiet=True, show_varnames=True)def borrow_a_book(username: str, bookname: str) -> None:# use ':p' to point to the parent frameprint(username, bookname, ':p')borrow_a_book('Shawn', 'Python Crash Course')# after a while...borrow_a_book('Alice', 'Deep Learning With Python')

将打印输出到其他处理器 (实验性功能)

import atexit
import lk_logger
from lk_logger import parallel_printinglk_logger.setup(quiet=True)class MyLogger:def __init__(self):self._buffer = []atexit.register(self.close)def write(self, msg: str):self._buffer.append(msg)def close(self) -> None:with open('log.txt', 'w') as f:f.write('\n'.join(self._buffer))class MyGui:def update_ui(self, msg: str) -> None:""" send message to GUI log panel. """...mylogger = MyLogger()
mygui = MyGui()with parallel_printing(mylogger.write,mygui.update_ui,inherit=True,  # default True. # ^ change to False to prevent default behavior (i.e. printing to console).
):print('hello world!')

标记语法

lk-logger 使用 “标记” 来简单快速地实现一些常用的高亮效果或文本格式化处理.

所谓的 “标记”, 是指位于 print 函数的第一个或最后一个参数位置的一个 str 类型的文本, 它以冒号开头, 后跟一个或多个字母和数字, 其形式如下:

python">print(':i', 'aaa')
print(':d', 'bbb')
print(':v2', 'ccc')
print(':v4t', 'ddd')
print('eee', ':i')
...

完整的标记符号表如下:

标记助记词说明
:ddivider分割线
:eexception异常信息格式化
:fflush清空缓存的打印流 (在多线程打印中有效)
:iindex计数器
:llong长文本格式, 美化对象输出格式
:pparent父层级反射
:rrich富文本格式 (采用 bbcode 高亮语法)
:sshort短文本格式 (减弱打印效果)
:ttimer计时器
:vverbosity打印等级

每个标记符号后面都可以跟一个数字, 数字范围 0 ~ 9. 如果不加数字, 则使用默认的数字, 如下表所示:

标记说明备注
:d0 (默认)默认风格的分割线 (一条单横线)
:d1块状风格的分割线 (多行文本)未实现
:e0 (默认)以 rich 风格美化异常信息
:e1:e0 基础上, 额外显示 locals 信息
:e2进入 pdb 交互式控制台未实现
:f0 (默认)清空缓存的打印流, 将它们输出到控制台
:f1清空缓存的打印流, 但不输出到控制台
(会显示一个 “已跳过多少条待打印信息” 的提示)
:f2无视缓存的打印流, 优先打印当前信息
(缓存不会被清空)
未来可能移除此项
:i0重置计数器
:i1 (默认)智能计数, 会在合适的作用域开始计数和自动重置计数
:i2行计数器, 每次调用计数 +1
:i3全局计数器, 每次调用计数 +1
:l0 (默认)长文本格式, 美化对象输出格式
:l1尽可能以可读的方式展示对象, 对一些 object 对象效果更好
:p0反射到自身层级 (也就是源码所在的文件行号)
:p1 (默认)反射到上一层级
:p2, :p3, :p4, …反射到上上一帧, 上上上一帧, …谨慎使用, 超过栈深度会报错
:r0 (默认)富文本风格 (采用 bbcode 高亮语法)
:r1打印 rich 对象, 例如 rich.panel.Panel 实例
:r2以合适的 rich 风格打印对象, 目前仅支持符合特定格式的 str, dict, list
:s0 (默认)短文本格式 (减弱打印效果)
:s1进一步减弱打印效果, 使其几乎与内置的 print 效果一致
:s2完全使用内置的 print 来处理打印
:t0重置计时器
:t1 (默认)计时 (打印到当前为止的时间戳)
:t2临时计时器, 局部计时器待重构
:v0 (默认)调试信息 (灰色高亮)
:v1负面提示信息 (紫色)
:v2正面提示信息, 或无倾向的提示信息 (蓝色)
:v3成功信息 (弱提醒) (暗绿色)
:v4成功信息 (绿色)
:v5弱警告 (暗黄色)
:v6警告 (黄色)
:v7报错 (弱提醒) (暗红色)
:v8报错 (红色)助记: 2, 4, 6, 8 为主; 1, 3, 5, 7 为辅

http://www.ppmy.cn/news/1570529.html

相关文章

DeepSeek各版本说明与优缺点分析

DeepSeek各版本说明与优缺点分析 DeepSeek是最近人工智能领域备受瞩目的一个语言模型系列,其在不同版本的发布过程中,逐步加强了对多种任务的处理能力。本文将详细介绍DeepSeek的各版本,从版本的发布时间、特点、优势以及不足之处&#xff0…

04树 + 堆 + 优先队列 + 图(D1_树(D10_决策树))

目录 一、引言 二、算法原理 三、算法实现 四、知识小结 一、引言 决策树算法是一种常用的机器学习算法,可用于分类和回归问题。它基于特征之间的条件判断来构 建一棵树,树的每个节点代表一个特征,每个叶节点代表一个类别或回归值。决策…

ChatGPT搜索免费开放:AI搜索引擎挑战谷歌霸主地位全面分析

引言 2025年2月6日,OpenAI宣布ChatGPT搜索功能向所有用户免费开放,且无需注册登录。这一重大举措在搜索引擎行业引发巨大反响,有观点认为"谷歌搜索时代即将结束"。本文将深入分析ChatGPT生成式AI搜索对谷歌搜索业务及全球搜索市场…

【C语言系列】深入理解指针(5)

深入理解指针(5) 一、sizeof和strlen的对比1.1sizeof1.2strlen1.3sizeof和strlen的对比 二、数组和指针笔试题解析2.1 一维数组2.2 字符数组2.2.1代码1:2.2.2代码2:2.2.3代码3:2.2.4代码4:2.2.5代码5&#…

【DeepSeek】DeepSeek小模型蒸馏与本地部署深度解析DeepSeek小模型蒸馏与本地部署深度解析

一、引言与背景 在人工智能领域,大型语言模型(LLM)如DeepSeek以其卓越的自然语言理解和生成能力,推动了众多应用场景的发展。然而,大型模型的高昂计算和存储成本,以及潜在的数据隐私风险,限制了…

Log4j2在Spring项目中的集成与应用

在现代的Java开发中,日志记录是不可或缺的一部分。它不仅可以帮助我们追踪程序的运行状态,还能在出现问题时快速定位原因。Log4j2作为Log4j的升级版本,提供了更强大的功能和更高的性能。今天,我们就来详细探讨一下如何在Spring项目…

【Redis】主从模式,哨兵,集群

主从复制 单点问题: 在分布式系统中,如果某个服务器程序,只有一个节点(也就是一个物理服务器)来部署这个服务器程序的话,那么可能会出现以下问题: 1.可用性问题:如果这个机器挂了…

知识图谱可视化系统python+neo4j+vue3

基于Neo4j知识图谱的构建及可视化 前言 手把手教你基于Neo4j构建知识图谱可视化系统。有任何疑问或者需要提供帮助都可以私信我。 在线体验 一、环境搭建 1.1 安装JDK 下载和安装Neo4j之前,首先必须 安装Java JDK,因为Neo4j是基于Java的图形数据库&a…