DeBug Python代码全靠print函数?换用这个一天2K+Star的工具吧,改进版
- pysnooper是代码debug神器,比无限low print好很多和也比日志debug好一些,比断点调试也好一些,这个很犀利的装饰器。
- https://www.toutiao.com/a6682957535856558606/
DeBug Python代码全靠print函数?换用这个一天2K+Star的工具吧- 对其修改了2点。
1、由于部署一般是linux,开发是windows,所以可以禁止linux上使用调试,相同的代码在linux上运行,调试装饰器自动失效,因为忘了注释掉装饰器,在生产调试会消耗性能。
2、将代码运行轨迹修改成可以点击的,点击控制台的行号即可跳转到pycharm对应的代码行。
3、提供一个猴子补丁,使用猴子补丁修改三方包的模块级全局变量MAX_VARIABLE_LENGTH ,最大变量默认是100,但对调试对接方json时候,往往很大,可以加大到最大显示10万个字母。
- # -*- coding: utf-8 -*-
- # @Author : ydf
- import datetime
- import os
- from functools import wraps
- import decorator
- import pysnooper # 需要安装 pip install pysnooper==0.0.11
- from pysnooper.pysnooper import get_write_function
- from pysnooper.tracer import Tracer, get_local_reprs, get_source_from_frame
- os_name = os.name
- class TracerCanClick(Tracer):
- """
- 使运行轨迹可点击。
- """
- def trace(self, frame, event, arg):
- if frame.f_code is not self.target_code_object:
- if self.depth == 1:
- return self.trace
- else:
- _frame_candidate = frame
- for i in range(1, self.depth):
- _frame_candidate = _frame_candidate.f_back
- if _frame_candidate is None:
- return self.trace
- elif _frame_candidate.f_code is self.target_code_object:
- indent = ' ' * 4 * i
- break
- else:
- return self.trace
- else:
- indent = ''
- self.frame_to_old_local_reprs[frame] = old_local_reprs = \
- self.frame_to_local_reprs[frame]
- self.frame_to_local_reprs[frame] = local_reprs = \
- get_local_reprs(frame, variables=self.variables)
- modified_local_reprs = {}
- newish_local_reprs = {}
- for key, value in local_reprs.items():
- if key not in old_local_reprs:
- newish_local_reprs[key] = value
- elif old_local_reprs[key] != value:
- modified_local_reprs[key] = value
- newish_string = ('Starting var:.. ' if event == 'call' else
- 'New var:....... ')
- for name, value_repr in newish_local_reprs.items():
- self.write('{indent}{newish_string}{name} = {value_repr}'.format(
- **locals()))
- for name, value_repr in modified_local_reprs.items():
- self.write('{indent}Modified var:.. {name} = {value_repr}'.format(
- **locals()))
- now_string = datetime.datetime.now().time().isoformat()
- source_line = get_source_from_frame(frame)[frame.f_lineno - 1]
- # print(frame)
- # print(dir(frame.f_code))
- # print(frame.f_code.co_filename)
- file_name_and_line = f'{frame.f_code.co_filename}:{frame.f_lineno}'
- # print(file_name_and_line)
- # self.write('{indent}{now_string} {event:9} '
- # '{frame.f_lineno:4} {source_line}'.format(**locals()))
- file_name_and_line2 = f'"{file_name_and_line}"'
- self.write('{indent}{now_string} {event:9} ' # REMIND 主要是修改了这一行,使debug可点击。
- '{file_name_and_line2:100} {source_line}'.format(**locals()))
- return self.trace
- def _snoop_can_click(output=None, variables=(), depth=1, prefix=''):
- write = get_write_function(output)
- # noinspection PyShadowingBuiltins
- @decorator.decorator
- def decorate(function, *args, **kwargs):
- target_code_object = function.__code__
- with TracerCanClick(target_code_object=target_code_object,
- write=write, variables=variables,
- depth=depth, prefix=prefix):
- return function(*args, **kwargs)
- return decorate
- def snoop_deco(output=None, variables: tuple = (), depth=1, prefix='', do_not_effect_on_linux=True, line_can_click=True):
- # REMIND 对装饰器再包装一次,不使用上面的和官方的。
- def _snoop(func):
- nonlocal prefix
- if prefix == '':
- prefix = f'调试 [{func.__name__}] 函数 --> '
- @wraps(func)
- def __snoop(*args, **kwargs):
- if os_name == 'posix' and do_not_effect_on_linux: # 不在linux上debug
- return func(*args, **kwargs)
- else:
- if line_can_click:
- return _snoop_can_click(output, variables, depth, prefix)(func)(*args, **kwargs)
- else:
- return pysnooper.snoop(output, variables, depth, prefix)(func)(*args, **kwargs)
- return __snoop
- return _snoop
- def patch_snooper_max_variable_length(max_lenth=100000):
- """
- 提供一个猴子补丁,三方包默认是变量最大显示100个字母,对于我这种经常debug对接方json的,要加到10万才能显示一个josn。
- 最好是放在__name__ == main中去执行此补丁,否则由于模块是单例的永远只导入一次,如果本文件被其他地方导入,也会改变当前python解释器的其他也使用snooper地方的运行表现也加到10万了。
- :param max_lenth:
- :return:
- """
- from pysnooper import tracer
- tracer.MAX_VARIABLE_LENGTH = max_lenth
- if __name__ == '__main__':
- @snoop_deco(line_can_click=True)
- def fun2():
- x = 1
- x += 2
- fun2()
原版是上面这样,不能点击,修改后,直接点击链接可以跳转到代码对应地方。不用加很多print来确定代码运行了什么分支。
DeBug Python代码全靠print函数?换用这个一天2K+Star的工具吧,改进版的更多相关文章
- Python基础语法之“print()”函数
print()函数是Python入门的第一个必学知识点,它经常被用来调试已写的代码,检验效果,今天小老鼠就带你盘点一下print()函数在Python中如何使用. print()函数的工作流程是这样的 ...
- Python 让两个print()函数的输出打印在一行内
1.两个连续的print()函数为什么在输出时内容会分行显示? 解:print()中有两个默认参数 sep 和 end,其中sep是代替分隔符,end是代替末尾的换行符,默认使用‘,’代替空格,且默认 ...
- 使用13行Python代码实现四则运算计算器函数
原创的刷新行数记录的代码!!! 支持带小括号,支持多个连续+-号,如-7.9/(-1.2-++--99.3/-4.44)*---(2998.654+-+-+-(+1.3-7.654/(-1.36-99 ...
- 转载 为什么print在Python 3中变成了函数?
转载自编程派http://codingpy.com/article/why-print-became-a-function-in-python-3/ 原作者:Brett Cannon 原文链接:htt ...
- python format函数/print 函数详细讲解(4)
在python开发过程中,print函数和format函数使用场景特别多,下面分别详细讲解两个函数的用法. 一.print函数 print翻译为中文指打印,在python中能直接输出到控制台,我们可以 ...
- #7 Python代码调试
前言 Python已经学了这么久了,你现在已经长大了,该学会自己调试代码了!相信大家在编写程序过程中会遇到大量的错误信息,我也不例外的啦-遇到这些问题该怎么解决呢?使用最多的方法就是使用print打印 ...
- Python语言系列-04-高阶函数
闭包 #!/usr/bin/env python3 # author:Alnk(李成果) # 什么是闭包 # 1,闭包存在于函数中 # 2,闭包就是内层函数对外层函数(非全局变量)的引用 # 3,最内 ...
- python中常用内置函数和关键词
Python 常用内置函数如下: Python 解释器内置了很多函数和类型,您可以在任何时候使用它们.以下按字母表顺序列出它们. 1. abs()函数 返回数字的绝对值. print( abs(-45 ...
- SoC的Testbench中的简易bus_monitor(加入print函数)
SoC的Testbench中的简易bus_monitor(加入print函数) 主要思路 向固定地址写信息 使用工具链将C写的print/printf函数编译成hex文件 在testbench中创建b ...
随机推荐
- C++程序设计方法3:函数重写
派生类对象包含从基类继承类的数据成员,他们构成了“基类子对象”基类中的私有成员,不允许在派生类成员函数中被访问,也不允许派生类的对象访问他们:真正体现基类私有,对派生类也不开放其权限:基类中的公有成员 ...
- Vue(二十三)vuex + axios + 缓存 运用 (以登陆功能为例)
(一)axios 封装 (1)axios拦截器 可以在axios中加入加载的代码... (2)封装请求 后期每个请求接口都可以写在这个里面... (二)vuex user.js import { lo ...
- ibatis中使用缓存
简单在ibatis中使用cache 首先设置SqlMapConfig.xml中<settings/>节点的属性cacheModelsEnabled="true" ...
- 给已经存在的项目添加git
1.打开终端,cd到已存在项目的目录 2.输入以下命令行,初始化一个本地仓库: git init 3.输入以下命令,把工程所有文件都添加到该仓库中(千万别忘记后面的.号!!!): git ...
- Linux修改网卡名称的方法
假设我们要修改网卡名为mybridge 实现步骤如下 1.# vim /etc/modprobe.conf 找到alias eth0 vmxnet 将eth0改为你想要的网卡名称 例: alias m ...
- Gitbook 简介 使用总结 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- gitbook安装与使用,并使用docker部署
本文简单介绍如何安装并使用gitbook,最后如何使用docker构建书籍镜像. 1. 前置条件 需要Nodejs环境,安装npm,国内用户再安装cnpm npm install -g cnpm -- ...
- 有钱人都用iphone?
身边的朋友用iphone, 大家都会调侃真有钱. 大数据显示, 人家是真的有钱. 看看来自腾讯移动分析数据 你玩过抖音就知道, 拍视频, 传视频的过的看着都挺滋润的. 反观用安卓的用户, 前20个应用 ...
- TensorFlow实战Google深度学习框架1-4章学习笔记
目录 第1章 深度学习简介 第2章 TensorFlow环境搭建 第3章 TensorFlow入门 第4章 深层神经网络 第1章 深度学习简介 对于许多机器学习问题来说,特征提取不是一件简单的事情 ...
- 认知:关于Android 调试的坑
要注意充电线和数据线的区别! 要注意充电线和数据线的区别! 要注意充电线和数据线的区别! 可以通过访问 :chrome://inspect/#devices 查看设备是否正常. 通常电脑也会有提示, ...