1. 首页
  2. 综合百科
  3. 错误是什么意思?中文翻译(Python程序员调试工具)

错误是什么意思?中文翻译(Python程序员调试工具)

简介:关于错误是什么意思?中文翻译(Python程序员调试工具)的相关疑问,相信很多朋友对此并不是非常清楚,为了帮助大家了解相关知识要点,小编为大家整理出如下讲解内容,希望下面的内容对大家有帮助!
如果有更好的建议或者想看更多关于综合百科技术大全及相关资讯,可以多多关注茶馆百科网。

整理|瑞秋编辑|简出品|Python大本营(ID: Python News)【简介】程序员每天都伴随着debug。新手程序员需要学习的调试方法复杂多样,比如设置断点、查看变量值等.有些网站还专门为调试写了新手教程。老司机在大型项目中调试都有不同的问题,模块多,代码长,大型项目调试之路堵而长。鉴于新手和有经验的程序员会遇到不同的调试问题,本文推荐GitHub上的两个开源调试工具:PySnooper和looke,帮助你更优雅简洁地调试代码。

前言

在之前的推荐中,营长介绍了一些有趣的实用工具,包括UI自动测试工具、代码修复神器、帮助小白快速修复错误、pdf翻译工具、变量命名神器等等。今天营长就来推荐两款基于Python的调试工具:PySnooper和tools,帮助你有针对性的优雅调试不同规模的项目。

检查变量值是调试过程中常见的事情。Python开发者可以使用print逐个输出变量。还有其他方法吗?实际上,使用Print语句查看变量有时会很繁琐:首先需要找到变量所在的代码行,然后注释掉部分代码,添加一行输出命令;然后按照原来的步骤恢复。这一波操作在代码量较大的情况下会消耗大量的精力,而且如果忘记恢复,或者恢复代码时出现手动错误,甚至可能在调试时增加一个新的deBug,真的不值得!

另外,在一些大型项目中,我们有时只需要调试项目的一些模块或者代码行,但是在调试Python项目时,需要手动分割代码来满足调试需求,这就增加了调试的难度。

为了让大家更专注于写代码,调试更轻松,营长特意挑选了Github的两款调试神器:PySnooper和looke,分别推荐给新手和大型代码项目的老司机。

接下来简单介绍和比较两个工具的特点,然后详细讲解使用步骤和功能。如果想查看工具的源代码和文档,可以在文末查看,别忘了给营长一个& quot看着& quot!

PySnooper与Behold对比:

对象不同,简洁相同

使用对象不同?的两个项目有何异同两位作者对项目的描述很容易就能发现它们之间的区别:PySnooper ——a Poorman的调试器& quot,针对程序员新手;Behold——是专门为大型Python项目构建的调试工具。

安装与使用's的两个工具不约而同地采取& quot简单易用& quot作为首要目标。PySnooper和looke都是一行代码,得到:“pipi install & quot;在使用上,两者都对视图变量进行了有针对性的改进,都支持使用一行命令输出多个变量,与之前使用print语句的方式不同。

相比特性, PySnooper更适合调试单个函数,在函数变量的变化过程和指向操作所在的代码行上更为突出。它可以在变量值和值发生变化时输出相应的代码行,并将输出保存为文件。looke更注重代码的整体调试和调试过程中变量的筛选,比如支持区分全局变量和局部变量。

具体而言,PySnooper的特性包括:

输出函数中变量变化的详细过程记录,包括变量值、引起变量变化的相关代码行、变化时间。将上述记录输出为. log文件。查找一个或多个非局部变量的值。输出缓存中调试函数引用的函数的变量变化记录。输出记录以提高运行速度。Behold的特性包括:.

简单输出一个或多个变量的变化过程,根据变量的值有条件地过滤输出,给变量的输出值赋予自定义标签,提高输出结果的区分度;根据调试变量所属函数的模块过滤是否输出变量值;根据全局变量和局部变量过滤输出;将输出存储为熊猫。数据帧格式数据;并在输出时用自定义字典重新定义变量的输出值,PySnooper:新手程序员救星.

1.安装:使用pip

Pipinstallpysnooper2。设置要调试的函数:使用@pysnooper.snoop()。

importpysnooper @ pysnooper . snoop()def number _ to _ bits(number): if number : bits=[]while number : number,Remainer=div mod(number,2)bits.insert(0,Remainer)returnbitselle 3360 return[0]number _ to _ bits(6)输出如下:

Startingvar:number=621:14333632.099769 call 3 @ pysnooper . snoop()21:1433336

ine6bits=[]Newvar:.......bits=[]21:14:32.099769line7whilenumber:21:14:32.099769line8number,remainder=divmod(number,2)Newvar:.......remainder=0Modifiedvar:..number=321:14:32.099769line9bits.insert(0,remainder)Modifiedvar:..bits=[0]21:14:32.099769line7whilenumber:21:14:32.099769line8number,remainder=divmod(number,2)Modifiedvar:..number=1Modifiedvar:..remainder=121:14:32.099769line9bits.insert(0,remainder)Modifiedvar:..bits=[1,0]21:14:32.099769line7whilenumber:21:14:32.099769line8number,remainder=divmod(number,2)Modifiedvar:..number=021:14:32.099769line9bits.insert(0,remainder)Modifiedvar:..bits=[1,1,0]21:14:32.099769line7whilenumber:21:14:32.099769line10returnbits21:14:32.099769return10returnbits

3.将上述记录输出为文件,并保存在文件夹:文件命名为file.log,保存在“/my/log/”文件夹:

@pysnooper.snoop('/my/log/file.log')

4.查看一个或多个非局部变量的值:查看foo.bar,self.whatever变量的改变过程,这两个变量不在number_to_bits函数中

@pysnooper.snoop(variables=('foo.bar','self.whatever'))

5.输出调试函数所引用的函数的变量更改记录:

@pysnooper.snoop(depth=2)

6.在缓存中输出记录,提高运行速度:

@pysnooper.snoop(prefix='ZZZ')

Beholder:针对大型Python项目的调制工具

1.安装:使用pip

pipinstallbehold

2.简单输出一个或多个变量的改变过程:

frombeholdimportBeholdletters=['a','b','c','d','A','B','C','D']forindex,letterinenumerate(letters):#输出效果等价于如下代码#print('index:{},letter:{}'.format(index,letter))Behold().show('index','letter')

3.依据变量的值对输出进行条件筛选:

frombeholdimportBeholdletters=['a','b','c','d','A','B','C','D']forindex,letterinenumerate(letters):#输出效果等价于如下代码#ifletter.upper()==letterandindex%2==0:#print('index:{}'.format(index))Behold().when(letter.upper()==letterandindex%2==0).show('index')

4.对变量的输出值给予自定义标签,提高输出结果的区分度:这里依据变量的值分别打“even_uppercase”和“odd_losercase”标签,附在变量之后

frombeholdimportBeholdletters=['a','b','c','d','A','B','C','D']forindex,letterinenumerate(letters):#输出效果等价于如下代码#ifletter.upper()==letterandindex%2==0:#print('index:{},letter:,{},even_uppercase'.format(index,letter))#ifletter.upper()!=letterandindex%2!=0:#print('index:{},letter:{}odd_lowercase'.format(index,letter))Behold(tag='even_uppercase').when(letter.upper()==letterandindex%2==0).show('index','letter')Behold(tag='odd_lowercase').when(letter.lower()==letterandindex%2!=0).show('index','letter')

5.依据调试变量所在函数的所属模块筛选是否输出变量值:

首先使用behold对函数设定调试规则:

frombeholdimportBehold#这是一个在代码库中常用的自定义函数defmy_function():x='hello'#这是函数本身的逻辑#在“testing”环境时输出x的值Behold().when_context(what='testing').show('x')#仅在“debug”环境时对函数进行调试输出ifBehold().when_context(what='debugging').is_true():importpdb;pdb.set_trace()

在另一个代码模块中对设定调试规则的函数进行调试:

frombeholdimportin_context#设置context为“testing”@in_context(what='testing')deftest_x():my_function()test_x()#将输出'x:hello'#使用环境管理器设置环境为“debugging”以进行调试within_context(what='debugging'):my_function()#转至pdb调试工具

6.输出对象的部分或全部属性:使用“with_args”指定调试对象的部分属性,使用“no_args”输出调试对象的全部属性

frombeholdimportBehold,Itemitem=Item(a=1,b=2,c=3)#输出对象的部分属性Behold(tag='with_args').show(item,'a','b')#输出对象的全部属性Behold(tag='no_args').show(item)

7.依据全局变量和局部变量对输出进行筛选:

from__future__importprint_functionfrombeholdimportBehold,Item#定义全局变量g='global_content'#定义一个函数,设定局部变量defexample_func():employee=Item(name='Toby')boss=Item(employee=employee,name='Michael')print('#Can\'tseeglobalvariable')Behold().show('boss','employee','g')print('\n#Icanseethetheboss\'sname,butnotemployeename')Behold('no_employee_name').show(boss)print('\n#Hereishowtoshowglobalvariables')Behold().show(global_g=g,boss=boss)#可以对变量的输出顺序进行调整print('\n#Youcanforcevariableorderingbysupplyingstringarguments')Behold().show('global_g','boss',global_g=g,boss=boss)print('\n#Andasimilarstrategyfornestedattributes')Behold().show(employee_name=boss.employee.name)example_func()

8.将输出存储为Pandas.Dataframe格式的数据:需要对变量值的标签进行定义,标签将存储为变量的键值

from__future__importprint_functionfrompprintimportpprintfrombeholdimportBehold,in_context,get_stash,clear_stashdefmy_function():out=[]fornninrange(5):x,y,z=nn,2*nn,3*nnout.append((x,y,z))#对变量值的标签进行定义#尽在测试x的环境下存储y和z的值Behold(tag='test_x').when_context(what='test_x').stash('y','z')#仅在测试y的环境下存储x和z的值Behold(tag='test_y').when_context(what='test_y').stash('x','z')#仅在测试z的环境下存储x和y的值Behold(tag='test_z').when_context(what='test_z').stash('x','y')returnout@in_context(what='test_x')deftest_x():assert(sum([t[0]fortinmy_function()])==10)@in_context(what='test_y')deftest_y():assert(sum([t[1]fortinmy_function()])==20)@in_context(what='test_z')deftest_z():assert(sum([t[2]fortinmy_function()])==30)test_x()test_y()test_z()print('\n#contentsoftest_xstash.Noticeonlyyandzasexpected')pprint(get_stash('test_x'))print('\n#contentsoftest_ystash.Noticeonlyxandzasexpected')pprint(get_stash('test_y'))print('\n#contentsoftest_zstash.Noticeonlyxandyasexpected')print(get_stash('test_z'))

也可以对存储的结果进行清除。

clear_stash()

当该命令的参数为空时,默认清除所有调试数据的缓存。如果想要指定清除某个或某些参数的调试缓存数据,则需在参数中进行指定。

9.在输出时使用自定义字典对变量输出的值进行重新定义:

下例中对变量的值进行了自定义。假设自定义字典中的键值为数据库索引,下例展示了将该索引转变为自定义标签的方法。

from__future__importprint_functionfrombeholdimportBehold,Item#定义Behold的子类以支持自定义的属性提取classCustomBehold(Behold):@classmethoddefload_state(cls):cls.name_lookup={1:'John',2:'Paul',3:'George',4:'Ringo'}defextract(self,item,name):#如果没有加载lookupstate,则先进行加载ifnothasattr(self.__class__,'name_lookup'):self.__class__.load_state()#抽取变量的值val=getattr(item,name)#如果变量是一个Item类变量,则进行值转换ifisinstance(item,Item)andname=='name':returnself.__class__.name_lookup.get(val,None)#否则使用Behold默认的转换函数else:returnsuper(CustomBehold,self).extract(item,name)#定义一组Item变量用于测试items=[Item(name=nn)fornninrange(1,5)]print('\n#ShowitemsusingstandardBeholdclass')foriteminitems:Behold().show(item)print('\n#ShowitemsusingCustomBeholdclasswithspecializedextractor')foriteminitems:CustomBehold().show(item,'name','instrument')

总结

在本文中,营长针对新手程序员和Python大型项目的代码调试为大家分别推荐了PySnooper和Behold两个调试工具,帮助大家简化代码调试过程、优化调试输出,以提高代码调试效率,希望对大家有所帮助。在未来,营长也会继续努力为大家发掘更多好用的工具,帮助大家更优雅地书写代码。

PySnooper的Github地址:https://github.com/cool-RR/PySnooper/tree/2c8c74903d20e0e52e358ce95af437a18f5fb495Behold的Github地址:https://github.com/robdmc/behold

(本文为Python大本营原创文章,转载请微信联系1092722531)

本文主要介绍了关于错误是什么意思?中文翻译(Python程序员调试工具)的相关养殖或种植技术,综合百科栏目还介绍了该行业生产经营方式及经营管理,关注综合百科发展动向,注重系统性、科学性、实用性和先进性,内容全面新颖、重点突出、通俗易懂,全面给您讲解综合百科技术怎么管理的要点,是您综合百科致富的点金石。
以上文章来自互联网,不代表本人立场,如需删除,请注明该网址:http://23.234.50.4:8411/article/102313.html