郑州专业的网站建设公司哪家好wordpress文章投稿
- 作者: 五速梦信息网
- 时间: 2026年04月20日 03:44
当前位置: 首页 > news >正文
郑州专业的网站建设公司哪家好,wordpress文章投稿,重庆 网站 建设 公司,网站制作公司北京华网大家好#xff0c;对于每个程序开发者来说#xff0c;调试几乎是必备技能。
代码写到一半卡住了#xff0c;不知道这个函数执行完的返回结果是怎样的#xff1f;调试一下看看
代码运行到一半报错了#xff0c;什么情况#xff1f;怎么跟预期的不一样#xff1f;调试一…大家好对于每个程序开发者来说调试几乎是必备技能。
代码写到一半卡住了不知道这个函数执行完的返回结果是怎样的调试一下看看
代码运行到一半报错了什么情况怎么跟预期的不一样调试一下看看
调试的方法多种多样不同的调试方法适合不同的场景和人群。 如果你是刚接触编程的小萌新对很多工具的使用还不是很熟练那么 print 和 log 大法好 如果你在本地Win或者Mac电脑上开发那么 IDE 的图形化界面调试无疑是最适合的 如果你在服务器上排查BUG那么使用 PDB 进行无图形界面的调试应该是首选 如果你要在本地进行开发但是项目的进行需要依赖复杂的服务器环境那么可以了解下 PyCharm 的远程调试
除了以上今天明哥再给你介绍一款非常好用的调试工具它能在一些场景下大幅度提高调试的效率 那就是 PySnooper它在 Github 上已经收到了 13k 的 star获得大家的一致好评。
有了这个工具后就算是小萌新也可以直接无门槛上手从此与 print 说再见~ 文章目录技术提升1. 快速安装2. 简单案例3. 详细使用2.1 重定向到日志文件2.2 跟踪非局部变量值2.3 设置跟踪函数的深度2.4 设置调试日志的前缀2.5 设置最大的输出长度2.6 支持多线程调试模式2.7 自定义对象的格式输出技术提升
技术要学会分享、交流不建议闭门造车。一个人走的很快、一堆人可以走的更远。
本文来自技术群粉丝的分享、推荐资料、代码、数据、技术交流提升均可加交流群获取群友已超过2000人添加时切记的备注方式为来源兴趣方向方便找到志同道合的朋友。 方式①、添加微信号pythoner666备注来自 CSDN python 方式②、微信搜索公众号Python学习与数据挖掘后台回复加群 1. 快速安装
执行下面这些命令进行安装 PySnooper
\( python3 -m pip install pysnooper # 或者
\) conda install -c conda-forge pysnooper # 或者
$ yay -S python-pysnooper 2. 简单案例
下面这段代码定义了一个 demo_func 的函数在里面生成一个 profile 的字典变量然后去更新它最后返回。
代码本身没有什么实际意义但是用来演示 PySnooper 已经足够。
import pysnooper pysnooper.snoop()
def demo_func(): profile {} profile[name] 写代码的明哥 profile[age] 27 profile[gender] male return profile def main(): profile demo_func() main() 现在我使用终端命令行的方式来运行它
[rootiswbm ~]# python3 demo.py
Source path:… demo.py
17:52:49.624943 call 4 def demo_func():
17:52:49.625124 line 5 profile {}
New var:……. profile {}
17:52:49.625156 line 6 profile[name] 写代码的明哥
Modified var:.. profile {name: 写代码的明哥}
17:52:49.625207 line 7 profile[age] 27
Modified var:.. profile {name: 写代码的明哥, age: 27}
17:52:49.625254 line 8 profile[gender] male
Modified var:.. profile {name: 写代码的明哥, age: 27, gender: male}
17:52:49.625306 line 10 return profile
17:52:49.625344 return 10 return profile
Return value:.. {name: 写代码的明哥, age: 27, gender: male}
Elapsed time: 00:00:00.000486 可以看到 PySnooper 把函数运行的过程全部记录了下来包括 代码的片段、行号等信息以及每一行代码是何时调用的 函数内局部变量的值如何变化的何时新增了变量何时修改了变量。 函数的返回值是什么 运行函数消耗了多少时间
而作为开发者要得到这些如此详细的调试信息你需要做的非常简单只要给你想要调试的函数上带上一顶帽子装饰器 – pysnooper.snoop() 即可。
详细使用 2.1 重定向到日志文件 pysnooper.snoop() 不加任何参数时会默认将调试的信息输出到标准输出。 对于单次调试就能解决的 BUG 这样没有什么问题但是有一些 BUG 只有在特定的场景下才会出现需要你把程序放在后面跑个一段时间才能复现。 这种情况下你可以将调试信息重定向输出到某一日志文件中方便追溯排查。 pysnooper.snoop(output/var/log/debug.log)
def demo_func(): … 2.2 跟踪非局部变量值 PySnooper 是以函数为单位进行调试的它默认只会跟踪函数体内的局部变量若想跟踪全局变量可以给 pysnooper.snoop() 加上 watch 参数 out {foo: bar} pysnooper.snoop(watch(out[foo]))
def demo_func(): … 如此一来PySnooper 会在 out[foo] 值有变化时也将其打印出来 watch 参数接收一个可迭代对象可以是list 或者 tuple里面的元素为字符串表达式什么意思呢看下面例子就知道了 pysnooper.snoop(watch(out[foo], foo.bar, self.foo[bar]))
def demo_func(): … 和 watch 相对的pysnooper.snoop() 还可以接收一个函数 watch_explode表示除了这几个参数外的其他所有全局变量都监控。 pysnooper.snoop(watch_explode(foo, bar))
def demo_func(): … 2.3 设置跟踪函数的深度 当你使用 PySnooper 调试某个函数时若该函数中还调用了其他函数PySnooper 是不会傻傻的跟踪进去的。 如果你想继续跟踪该函数中调用的其他函数可以通过指定 depth 参数来设置跟踪深度不指定的话默认为 1。 pysnooper.snoop(depth2)
def demo_func(): … 2.4 设置调试日志的前缀 当你在使用 PySnooper 跟踪多个函数时调试的日志会显得杂乱无章不方便查看。 在这种情况下PySnooper 提供了一个参数方便你为不同的函数设置不同的标志方便你在查看日志时进行区分。 pysnooper.snoop(output/var/log/debug.log, prefixdemo_func: )
def demo_func(): … 效果如下 2.5 设置最大的输出长度 默认情况下PySnooper 输出的变量和异常信息如果超过 100 个字符被会截断为 100 个字符。 当然你也可以通过指定参数 进行修改 pysnooper.snoop(max_variable_length200
def demo_func(): … 您也可以使用max_variable_lengthNone它从不截断它们。 pysnooper.snoop(max_variable_lengthNone
def demo_func(): … 2.6 支持多线程调试模式 PySnooper 同样支持多线程的调试通过设置参数 thread_infoTrue它就会在日志中打印出是在哪个线程对变量进行的修改。 pysnooper.snoop(thread_infoTrue)
def demo_func(): … 效果如下 2.7 自定义对象的格式输出 pysnooper.snoop() 函数有一个参数是 custom_repr它接收一个元组对象。 在这个元组里你可以指定特定类型的对象以特定格式进行输出。 这边我举个例子。 假如我要跟踪 person 这个 Person 类型的对象由于它不是常规的 Python 基础类型PySnooper 是无法正常输出它的信息的。 因此我在 pysnooper.snoop() 函数中设置了 custom_repr 参数该参数的第一个元素为 Person第二个元素为 print_persion_obj 函数。 PySnooper 在打印对象的调试信息时会逐个判断它是否是 Person 类型的对象若是就将该对象传入 print_persion_obj 函数中由该函数来决定如何显示这个对象的信息。 class Person:pass def print_person_obj(obj): return fPerson {obj.name} {obj.age} {obj.gender} pysnooper.snoop(custom_repr(Person, print_person_obj))
def demo_func(): … 完整的代码如下 import pysnooper class Person:pass def print_person_obj(obj): return fPerson {obj.name} {obj.age} {obj.gender} pysnooper.snoop(custom_repr(Person, print_person_obj))
def demo_func(): person Person() person.name 写代码的明哥 person.age 27 person.gender male return person def main(): profile demo_func() main() 运行一下观察一下效果。 如果你要自定义格式输出的有很多个类型那么 custom_repr 参数的值可以这么写 pysnooper.snoop(custom_repr((Person, print_person_obj), (numpy.ndarray, print_ndarray)))
def demo_func(): … 还有一点我提醒一下元组的第一个元素可以是类型如类名Person 或者其他基础类型 list等也可以是一个判断对象类型的函数。 也就是说下面三种写法是等价的。【第一种写法】
pysnooper.snoop(custom_repr(Person, print_persion_obj))
def demo_func(): … # 【第二种写法】
def is_persion_obj(obj): return isinstance(obj, Person) pysnooper.snoop(custom_repr(is_persion_obj, print_persion_obj))
def demo_func(): … # 【第三种写法】
pysnooper.snoop(custom_repr(lambda obj: isinstance(obj, Person), print_persion_obj))
def demo_func(): …
- 上一篇: 郑州注册公司网站宁波网站制作与推广价格
- 下一篇: 郑州专业的网站建设网站建设职能
相关文章
-
郑州注册公司网站宁波网站制作与推广价格
郑州注册公司网站宁波网站制作与推广价格
- 技术栈
- 2026年04月20日
-
郑州中企业网站建设做淘宝要网站
郑州中企业网站建设做淘宝要网站
- 技术栈
- 2026年04月20日
-
郑州制作企业网站个人网站 目的
郑州制作企业网站个人网站 目的
- 技术栈
- 2026年04月20日
-
郑州专业的网站建设网站建设职能
郑州专业的网站建设网站建设职能
- 技术栈
- 2026年04月20日
-
郑州专业做淘宝网站推广wordpress有中文版吗
郑州专业做淘宝网站推广wordpress有中文版吗
- 技术栈
- 2026年04月20日
-
郑州最好的网站建设有什么网站可以赚钱
郑州最好的网站建设有什么网站可以赚钱
- 技术栈
- 2026年04月20日
