Python-3.12.0文档解读-内置函数repr()详细说明+记忆策略+常用场景+巧妙用法+综合技巧


一个认为一切根源都是“自己不够强”的INTJ

个人主页:用哲学编程-CSDN博客
专栏:每日一题——举一反三
Python编程学习
Python内置函数

Python-3.12.0文档解读

目录

详细说明

概述

详细描述

自定义类的行为

使用示例

异常处理

注意事项

总结

记忆策略

常用场景

场景一:调试复杂数据结构

场景二:实现自定义类的调试信息

场景三:在交互式解释器中快速查看对象状态

场景四:记录日志中的对象状态

场景五:单元测试中的断言信息

巧妙用法

技巧一:序列化辅助工具

技巧二:复杂表达式的调试

技巧三:生成可读性的调试信息

技巧四:动态生成类实例

技巧五:调试复杂对象的状态变化

综合技巧

技巧一:结合 eval 实现配置文件的加载和保存

技巧二:结合 ast.literal_eval 实现更安全的动态数据加载

技巧三:结合 logging 模块记录详细调试信息

技巧四:结合 dataclass 和 repr 实现自动化的对象表示

技巧五:结合 functools 的 lru_cache 实现缓存调试信息

技巧六:结合 contextlib 模块实现上下文管理器的调试


详细说明

概述

repr(object) 函数返回一个对象的可打印表示形式的字符串。此字符串主要用于开发和调试阶段,因为它旨在让开发者能够明确地看到对象的表示形式。该字符串通常具有一定的可解释性,且在许多情况下可以通过 eval() 函数恢复原对象。

详细描述
  • 返回值:
  • 对于许多内置类型,repr() 返回的字符串通常具有合法的 Python 语法,从而可以传递给 eval() 函数以生成与原对象等效的对象。
  • 对于自定义类型,如果没有定义专门的 __repr__() 方法,repr() 返回的字符串将包含对象的类型名称以及对象的某些标识信息(如内存地址),并且这些信息通常会包含在尖括号 <> 中。
自定义类的行为

一个类可以通过定义 __repr__() 方法来控制 repr() 函数为其实例返回的内容。例如:

class MyClass:def __repr__(self):return '<MyClass instance>'

在这种情况下,调用 repr() 时,将返回 '<MyClass instance>'。

使用示例

# 内置类型示例
num = 123
print(repr(num))  # 输出: '123'text = "Hello, World!"
print(repr(text))  # 输出: "'Hello, World!'"# 自定义类示例
class MyClass:def __repr__(self):return '<MyClass instance>'obj = MyClass()
print(repr(obj))  # 输出: '<MyClass instance>'
异常处理

如果 sys.displayhook() 不可访问,调用 repr() 会引发 RuntimeError 异常。然而,在大多数标准的 Python 环境中,这种情况非常少见。

注意事项
  • 虽然 repr() 返回的字符串在许多情况下可以传递给 eval() 使用,但这并不总是适用。在实际开发中,应该谨慎使用 eval(),以避免安全风险。
  • repr() 主要用于调试和日志记录,以提供对对象内部状态的清晰表示。
总结

repr(object) 是一个非常有用的函数,特别是在调试和开发过程中。通过返回对象的描述性字符串,它帮助开发者更好地了解和检查对象的状态。自定义类通过定义 __repr__() 方法,可以进一步控制对象的表示形式,从而提高调试和日志记录的效率。


记忆策略


repr 是 representation 的缩写。representation 意为“表示”或“展现”。


常用场景

场景一:调试复杂数据结构

在调试复杂数据结构(如嵌套的列表或字典)时,repr 可以帮助清晰地展示数据结构的内容。

# 定义一个复杂的嵌套数据结构
data = {'name': 'Alice','age': 30,'children': [{'name': 'Bob', 'age': 8},{'name': 'Charlie', 'age': 5}]
}# 使用 repr 打印数据的详细表示形式
print(repr(data))  # 输出: {'name': 'Alice', 'age': 30, 'children': [{'name': 'Bob', 'age': 8}, {'name': 'Charlie', 'age': 5}]}

场景二:实现自定义类的调试信息

通过定义 __repr__() 方法,可以为自定义类提供更有用的调试信息。

class Person:def __init__(self, name, age):self.name = nameself.age = age# 定义 __repr__ 方法,返回对象的详细表示形式def __repr__(self):return f'Person(name={self.name!r}, age={self.age})'# 创建 Person 对象
p = Person('Alice', 30)# 使用 repr 打印 Person 对象的调试信息
print(repr(p))  # 输出: Person(name='Alice', age=30)

场景三:在交互式解释器中快速查看对象状态

在交互式 Python 解释器中,repr 可以用来快速查看对象的详细状态,有助于即时调试。

# 定义一个列表对象
my_list = [1, 2, 3, 'hello']# 在交互式解释器中,直接使用 repr 查看对象的详细状态
repr(my_list)  # 输出: [1, 2, 3, 'hello']

场景四:记录日志中的对象状态

在记录日志时,使用 repr 可以帮助捕捉对象的详细状态,以便日后分析问题。

import logging# 配置日志记录
logging.basicConfig(level=logging.DEBUG)class MyClass:def __init__(self, value):self.value = value# 定义 __repr__ 方法,提供对象的详细表示形式def __repr__(self):return f'MyClass(value={self.value!r})'# 创建 MyClass 对象
obj = MyClass('example')# 记录日志,包含对象的详细表示形式
logging.debug(f'Created object: {repr(obj)}')  # 日志输出: DEBUG:root:Created object: MyClass(value='example')

场景五:单元测试中的断言信息

在单元测试中,repr 可以帮助生成更有用的断言信息,便于调试测试失败的原因。

import unittestclass TestMyClass(unittest.TestCase):def test_repr(self):obj = MyClass('test')# 使用 repr 验证对象的表示形式self.assertEqual(repr(obj), "MyClass(value='test')")# 运行测试
if __name__ == '__main__':unittest.main()

通过这些详细的使用场景,可以看到 repr(object) 函数在调试、日志记录和单元测试等方面的重要性。每个场景的代码都配有详细的注释,帮助理解 repr 函数的实际应用。


巧妙用法

repr(object) 函数有一些不太常见但非常巧妙的使用技巧。以下是几个可能一般人想不到的使用场景和技巧:

技巧一:序列化辅助工具

repr 可以用作生成有效的 Python 表示,从而在没有使用专门的序列化工具(如 pickle 或 json)的情况下,实现简单的数据持久化。

# 定义一个简单的数据结构
data = {'key1': 'value1', 'key2': 42, 'key3': [1, 2, 3]}# 将数据结构转为字符串表示形式
data_str = repr(data)# 将字符串保存到文件中
with open('data.txt', 'w') as file:file.write(data_str)# 从文件中读取数据
with open('data.txt', 'r') as file:read_data_str = file.read()# 使用 eval 恢复原始数据结构
restored_data = eval(read_data_str)print(restored_data)  # 输出:{'key1': 'value1', 'key2': 42, 'key3': [1, 2, 3]}

注意:此技巧使用 eval,存在安全风险,仅应在受信任环境下使用。

技巧二:复杂表达式的调试

当调试涉及复杂表达式的代码时,可以使用 repr 获取中间变量的详细表示,有助于理解计算过程。

# 定义一个复杂的计算函数
def complex_calculation(a, b):step1 = a + bstep2 = step1 * 2step3 = step2 ** 0.5return step3# 调用函数,并在调试时输出每步的计算结果
a, b = 4, 5
print(f'step1: {repr(a + b)}')       # 输出:step1: 9
print(f'step2: {repr((a + b) * 2)}') # 输出:step2: 18
print(f'step3: {repr(18 ** 0.5)}')   # 输出:step3: 4.242640687119285

技巧三:生成可读性的调试信息

在定义类时,通过 __repr__() 方法生成更加可读且信息丰富的调试信息,尤其是在处理包含复杂内部状态的对象时。

class Matrix:def __init__(self, rows):self.rows = rowsdef __repr__(self):# 将矩阵表示为多行字符串,便于阅读row_strs = [repr(row) for row in self.rows]return f'Matrix(\n  ' + ',\n  '.join(row_strs) + '\n)'# 定义一个矩阵对象
matrix = Matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]])# 使用 repr 打印矩阵对象,便于调试
print(repr(matrix))
# 输出:
# Matrix(
#   [1, 2, 3],
#   [4, 5, 6],
#   [7, 8, 9]
# )

技巧四:动态生成类实例

通过 repr 和 eval 的结合,可以实现动态生成类实例的功能,适用于某些需要动态创建对象的应用场景。

class DynamicClass:def __init__(self, name, value):self.name = nameself.value = valuedef __repr__(self):# 返回可以重新创建对象的字符串return f'DynamicClass({repr(self.name)}, {repr(self.value)})'# 创建一个对象
original = DynamicClass('example', 42)# 获取对象的表示形式
representation = repr(original)# 动态生成新的对象
new_instance = eval(representation)print(new_instance)  # 输出:DynamicClass('example', 42)
print(original == new_instance)  # 输出:False(两者是不同的实例)

技巧五:调试复杂对象的状态变化

在调试复杂对象时,通过多次调用 repr 可以追踪对象在不同阶段的状态变化,有助于发现问题。

class Counter:def __init__(self):self.count = 0def increment(self):self.count += 1def decrement(self):self.count -= 1def __repr__(self):return f'Counter(count={self.count})'# 初始化计数器对象
counter = Counter()
print(repr(counter))  # 输出:Counter(count=0)# 执行一些操作并使用 repr 追踪状态
counter.increment()
print(repr(counter))  # 输出:Counter(count=1)counter.increment()
print(repr(counter))  # 输出:Counter(count=2)counter.decrement()
print(repr(counter))  # 输出:Counter(count=1)

以上这些技巧展示了 repr(object) 的一些巧妙用法,通过灵活运用 repr 函数,可以在调试、日志记录、数据持久化等方面获得更多便利。


综合技巧

好的,以下是一些结合 repr 函数与其他函数或方法的巧妙用法,这些用法利用了Python的灵活性和 repr 的强大功能,展示了其在不同场景下的应用。

技巧一:结合 eval 实现配置文件的加载和保存

通过 repr 和 eval 的结合,可以轻松地保存和恢复配置数据。

# 定义配置数据
config = {'setting1': 'value1','setting2': 42,'setting3': [1, 2, 3]
}# 将配置数据保存到文件
with open('config.py', 'w') as file:file.write('config = ' + repr(config) + '\n')# 从文件加载配置数据
from config import config as loaded_configprint(loaded_config)  # 输出:{'setting1': 'value1', 'setting2': 42, 'setting3': [1, 2, 3]}

技巧二:结合 ast.literal_eval 实现更安全的动态数据加载

使用 ast.literal_eval 代替 eval 可以提高安全性,避免执行任意代码的风险。

import ast# 定义一个复杂的数据结构
data = {"key1": "value1", "key2": 42, "key3": [1, 2, 3]}# 将数据结构转为字符串表示形式并保存到文件
with open('data.txt', 'w') as file:file.write(repr(data))# 从文件中读取数据
with open('data.txt', 'r') as file:read_data_str = file.read()# 使用 ast.literal_eval 恢复原始数据结构
restored_data = ast.literal_eval(read_data_str)print(restored_data)  # 输出:{'key1': 'value1', 'key2': 42, 'key3': [1, 2, 3]}

技巧三:结合 logging 模块记录详细调试信息

利用 repr 为日志记录提供详细的调试信息,不仅限于简单字符串。

import logging# 配置日志记录
logging.basicConfig(level=logging.DEBUG)class ComplexObject:def __init__(self, name, attributes):self.name = nameself.attributes = attributesdef __repr__(self):return f'ComplexObject(name={repr(self.name)}, attributes={repr(self.attributes)})'# 创建 ComplexObject 对象
obj = ComplexObject('Sample', {'attr1': 10, 'attr2': [1, 2, 3]})# 记录详细调试信息
logging.debug(f'Created object: {repr(obj)}')  # 日志输出:DEBUG:root:Created object: ComplexObject(name='Sample', attributes={'attr1': 10, 'attr2': [1, 2, 3]})

技巧四:结合 dataclass 和 repr 实现自动化的对象表示

使用 dataclasses 模块简化类定义,同时结合 repr 提供详细的对象表示。

from dataclasses import dataclass@dataclass
class Product:name: strprice: floatstock: int# dataclass 自动生成 __repr__ 方法# 但可以自定义 __repr__ 方法以提供更详细的表示形式def __repr__(self):return f'Product(name={repr(self.name)}, price={repr(self.price)}, stock={repr(self.stock)})'# 创建 Product 对象
product = Product('Laptop', 999.99, 50)# 使用 repr 打印 Product 对象的调试信息
print(repr(product))  # 输出:Product(name='Laptop', price=999.99, stock=50)

技巧五:结合 functools 的 lru_cache 实现缓存调试信息

通过 repr 和 functools.lru_cache,可以缓存函数调用的结果,并便于调试缓存中的数据。

from functools import lru_cache@lru_cache(maxsize=32)
def compute_square(n):result = n * nprint(f'Computing square of {n}: {result}')return result# 调用函数,缓存结果
compute_square(4)
compute_square(2)
compute_square(8)# 打印缓存内容
print(f'Cache info: {repr(compute_square.cache_info())}')  # 输出:Cache info: CacheInfo(hits=0, misses=3, maxsize=32, currsize=3)

技巧六:结合 contextlib 模块实现上下文管理器的调试

通过 repr 和 contextlib 模块,可以方便地调试上下文管理器的行为。

from contextlib import contextmanager@contextmanager
def debug_context(name):print(f'Entering context: {repr(name)}')yieldprint(f'Exiting context: {repr(name)}')# 使用上下文管理器
with debug_context('my_context'):print('Inside context')# 输出:
# Entering context: 'my_context'
# Inside context
# Exiting context: 'my_context'

这些技巧展示了 repr 函数在不同场景下与其他函数或方法结合使用的强大功能,帮助开发者更高效地调试、记录和管理代码中的各类信息。


感谢。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/342105.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】深入理解文件操作:从C语言接口到系统调用与缓冲区管理

文章目录 前言&#xff1a;1. 铺垫1.1. 对文件表述符的理解 2. 重新使用C文件接口&#xff1a;对比一下重定向2.1. 什么叫当前路径&#xff1f;2.2. 写入文件2.3. 读文件2.4. 程序默认打开的文件流2.5. 输出2.6. 输入 3. 系统调用提供的文件接口3.1. open 打开文件3.2. open函数…

更新关于其宠物产品质量的电子学习课程

​我们受托更新关于其宠物产品质量的电子学习课程。我们决定采用流行的“Corporate Memphis”风格设计插图&#xff0c;这是一种适用于商业的友好卡通风格&#xff08;该名称来源于80年代因其亮丽的色彩和独特的项目方法而闻名的设计团体“Memphis”&#xff09;。我们选择“Co…

C# Web控件与数据感应之 填充 HtmlTable

目录 关于 HtmlTable HtmlTable与BaseDataList的区别 准备数据源 ​范例运行环境 FillTable 方法 设计与实现 模板样例输出 Automatic 模式填充 ​ DynamicRows 模式填充 StaticRows 模式填充 ​ 小结 关于 HtmlTable 数据感应也即数据捆绑&#xff0c;是…

Dell戴尔XPS 16 9640 Intel酷睿Ultra9处理器笔记本电脑原装出厂Windows11系统包,恢复原厂开箱状态oem预装系统

下载链接&#xff1a;https://pan.baidu.com/s/1j_sc8FW5x-ZreNrqvRhjmg?pwd5gk6 提取码&#xff1a;5gk6 戴尔原装系统自带网卡、显卡、声卡、蓝牙等所有硬件驱动、出厂主题壁纸、系统属性专属联机支持标志、系统属性专属LOGO标志、Office办公软件、MyDell、迈克菲等预装软…

SEACells:元细胞分析

元细胞是从单细胞测序数据中衍生的细胞分组&#xff0c;代表高度精细的不同细胞状态。在这里&#xff0c;作者介绍了单细胞细胞状态聚集 (SEACells)&#xff0c;这是一种用于识别元细胞的算法&#xff0c;它克服了单细胞数据的稀疏性&#xff0c;同时保留了传统细胞聚类所掩盖的…

LeetCode322.零钱兑换

文章目录 题目描述解题思路递归记忆化搜索动态规划另一种实现 题目描述 https://leetcode.cn/problems/coin-change/description/?envTypestudy-plan-v2&envIdtop-interview-150 给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及一个整数 amount …

Java商城免 费 搭 建:VR全景到SAAS,各种模式一网打尽!

一、技术选型 java开发语言&#xff1a;java是一种跨平台的编程语言&#xff0c;适用于大型企业级应用开发。使用java开发直播商城可以保证系统的稳定性和可扩展性。 spring boot框架&#xff1a;spring boot是一个快速构建spring应用的框架&#xff0c;简化了开发过程&#xf…

linux动态调试 dev_dbg

动态调试使用方法 打开内核动态调试开关&#xff0c;make menuconfig选中CONFIG_DYNAMIC_DEBUG以及CONFIG_DEBUG_FS Linux启动后&#xff0c;使用命令行挂载上dbgfs 1. mkdir /mnt/dbg 2. mount -t debugfs none /mnt/dbg 1.控制某个文件所有dev_dbg()&#xff0c; echo -n &q…

【React篇 】React项目中常用的工具库

我们可以从项目初始化、开发、构建、检查及发布的顺序总结react项目开发常用的工具库。 首先是初始化。 初始化工程项目一般用官方维护的 create-react-app&#xff0c;这个工具使用起来简单便捷&#xff0c;但 create-react-app 的配置隐藏比较深&#xff0c;修改配置时搭配…

wampserver安装与汉化

wampserver安装与汉化 文章目录 wampserver安装与汉化一、安装二、汉化1.升级软件并安装补丁 介绍&#xff1a; WampServer是一款由法国人开发的Apache Web服务器、PHP解释器以及MySQL数据库的整合软件包。免去了开发人员将时间花费在繁琐的配置环境过程&#xff0c;从而腾出更…

蒙层(css)

如何在 Vue 中实现一个包含图像和蒙层效果的组件&#xff1f;这个组件根据某个条件显示或隐藏蒙层&#xff0c;用于表示图像是否已读。 1. 创建基础模板 首先&#xff0c;我们在模板中使用 div 包裹我们的图像组件 GraphImage&#xff0c;并为最外层 div 设置 position: relat…

【MySQL数据库】MySQL 高可用搭建方案——MHA实战

MHA&#xff08;Master High Availability&#xff09; MHA实战 MHA&#xff08;Master High Availability&#xff09; 一、MHA简介二、MHA搭建准备要求&#xff1a;mha集群搭建&#xff0c;4台服务器&#xff0c;1主2从&#xff0c;1台mha2.1实验思路2.2实验准备 三、搭建MyS…

新手学习编程网站一站式合集

LTPP在线开发平台 探索编程世界的新天地&#xff0c;为学生和开发者精心打造的编程平台&#xff0c;现已盛大开启&#xff01;这个平台汇集了近4000道精心设计的编程题目&#xff0c;覆盖了C、C、JavaScript、TypeScript、Go、Rust、PHP、Java、Ruby、Python3以及C#等众多编程语…

语音深度鉴伪识别项目实战:基于深度学习的语音深度鉴伪识别算法模型(三)音频去噪算法大全+Python源码应用

前言 深度学习技术在当今技术市场上面尚有余力和开发空间的&#xff0c;主流落地领域主要有&#xff1a;视觉&#xff0c;听觉&#xff0c;AIGC这三大板块。 目前视觉板块的框架和主流技术在我上一篇基于Yolov7-LPRNet的动态车牌目标识别算法模型已有较为详细的解说。与AIGC相…

运维开发介绍

目录 1.什么是运维开发 2.作用 3.优点 4.缺点 5.应用场景 5.1.十个应用场景 5.2.网站和Web应用程序 6.案例 7.小结 1.什么是运维开发 运维开发&#xff08;DevOps&#xff09;是一种结合软件开发&#xff08;Development&#xff09;与信息技术运维&#xff08;Opera…

Unity Apple Vision Pro 开发(一):开发前期准备【软硬件要求 | 开发者模式 | 无线调试打包】

文章目录 &#x1f4d5;教程说明&#x1f4d5;硬件要求&#x1f4d5;软件要求⭐Xcode 15.2 及以上⭐visionOS 1.0 (21N301) SDK 或者更高版本⭐Unity 2022 LTS for Apple Silicon (2022.3.18f1及以上的版本)⭐Unity Pro/Unity Enterprise/Unity Industry的授权许可证 &#x1f…

天锐绿盾 | -办公加密系统、数据防泄密软件、图档加密、文件资料防泄密、源代码防止泄露!

天锐绿盾 |- 透明加密、数据防泄密系统、信息安全管理平台&#xff0c;旨在为用户提供全面的数据防泄露解决方案。该系统集成了文件透明加密技术、内网终端安全管理、以及私有云文档管理等功能&#xff0c;能够在不影响用户日常操作习惯和网络开放性的前提下&#xff0c;保护设…

HTML入门

HTML入门 注意&#xff0c;水文自用&#xff0c;//并非HTML注释语言&#xff0c;&#xff08;<&#xff01;–XXX->&#xff09;才是 初始文件结构 Vscode中 &#xff01; tab <!DOCTYPE html> <html lang"en"> //根元素&#xff0c;起始点 &l…

【机器学习基础】Python编程04:五个实用练习题的解析与总结

Python是一种广泛使用的高级编程语言,它在机器学习领域中的重要性主要体现在以下几个方面: 简洁易学:Python语法简洁清晰,易于学习,使得初学者能够快速上手机器学习项目。 丰富的库支持:Python拥有大量的机器学习库,如scikit-learn、TensorFlow、Keras和PyTorch等,这些…

“新高考”下分班怎么分?

来自安徽的张女士告诉我&#xff1a;上一年孩子升入了高中&#xff0c;但没想到才高一&#xff0c;孩子就面临了一个困难的挑选&#xff1a;312”分班&#xff01; 什么是312”分班呢&#xff1f;许多人或许不明白&#xff0c;便是要求学生在高一入学时&#xff0c;针对于3门必…