精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Python Debug(調試)的終極指南

開發 后端
很多人使用一堆print語句來查看代碼中發生了什么。這種方法遠不是理想的,有更好的方法可以找出代碼的錯誤所在,本文將探討其中一些問題和應對方法。

即使您編寫了清晰可讀的代碼,即使您是非常有經驗的開發人員,奇怪的bug也不可避免地會出現,您將需要以某種方式調試它們。很多人使用一堆print語句來查看代碼中發生了什么。這種方法遠不是理想的,有更好的方法可以找出代碼的錯誤所在,本文將探討其中一些問題和應對方法。

日志是必須的

如果在編寫應用程序時沒有設置日志記錄,那么您最終會后悔的。應用程序中沒有任何日志會使故障排除變得非常困難。幸運的是,在Python中,建立基本的日志程序非常簡單:

  1. import logging 
  2. logging.basicConfig( 
  3.     filename='application.log'
  4.     level=logging.WARNING, 
  5.     format'[%(asctime)s] {%(pathname)s:%(lineno)d} %(levelname)s - %(message)s'
  6.     datefmt='%H:%M:%S' 
  7.  
  8. logging.error("Some serious error occurred.") 
  9. logging.warning('Function you are using is deprecated.') 

這就是所有你需要開始寫日志的文件,它看起來像這樣,你可以找到文件的路徑使用logger . getloggerclass ().root.handlers[0].baseFilename):

  1. [12:52:35] {<stdin>:1} ERROR - Some serious error occurred. 
  2. [12:52:35] {<stdin>:1} WARNING - Function you are using is deprecated. 

這種設置看起來似乎已經足夠好了(通常情況下也是如此),但是擁有配置良好、格式化、可讀的日志可以使您的工作變得更加容易。改進和擴展配置的一種方法是使用被logger讀取的.ini或.yaml文件。舉個例子,你可以在配置中做什么:

  1. version: 1 
  2. disable_existing_loggers: true 
  3.  
  4. formatters: 
  5.   standard: 
  6.     format: "[%(asctime)s] {%(pathname)s:%(lineno)d} %(levelname)s - %(message)s" 
  7.     datefmt: '%H:%M:%S' 
  8.  
  9. handlers: 
  10.   console:  # handler which will log into stdout 
  11.     class: logging.StreamHandler 
  12.     level: DEBUG 
  13.     formatter: standard  # Use formatter defined above 
  14.     stream: ext://sys.stdout 
  15.   file:  # handler which will log into file 
  16.     class: logging.handlers.RotatingFileHandler 
  17.     level: WARNING 
  18.     formatter: standard  # Use formatter defined above 
  19.     filename: /tmp/warnings.log 
  20.     maxBytes: 10485760 # 10MB 
  21.     backupCount: 10 
  22.     encoding: utf8 
  23.  
  24. root:  # Loggers are organized in hierarchy - this is the root logger config 
  25.   level: ERROR 
  26.   handlers: [console, file]  # Attaches both handler defined above 
  27.  
  28. loggers:  # Defines descendants of root logger 
  29.   mymodule:  # Logger for "mymodule" 
  30.     level: INFO 
  31.     handlers: [file]  # Will only use "file" handler defined above 
  32.     propagate: no  # Will not propagate logs to "root" logger 

在python代碼中使用這種擴展的配置將很難導航、編輯和維護。將內容保存在YAML文件中,可以通過非常特定的設置(如上面的設置)更容易地設置和調整多個日志記錄器。

在文件中有了配置,意味著我們需要加載。最簡單的方法做與YAML文件:

  1. import yaml 
  2. from logging import config 
  3.  
  4. with open("config.yaml", 'rt') as f: 
  5.     config_data = yaml.safe_load(f.read()) 
  6.     config.dictConfig(config_data) 

Python logger實際上并不直接支持YAML文件,但是它支持字典配置,可以使用YAML .safe_load輕松地從YAML創建字典配置。如果您更傾向于使用舊的.ini文件,那么我只想指出,對于新應用程序,根據文檔,推薦使用字典configs。

__repr__ 可讀的日志

對代碼進行簡單的改進,使其更具可調試性,可以在類中添加__repr__方法。如果你不熟悉這個方法-它所做的只是返回一個類實例的字符串表示。使用__repr__方法的最佳實踐是輸出可用于重新創建實例的文本。例如:

  1. class Circle: 
  2.     def __init__(self, x, y, radius): 
  3.         self.x = x 
  4.         self.y = y 
  5.         self.radius = radius 
  6.  
  7.     def __repr__(self): 
  8.         return f"Rectangle({self.x}, {self.y}, {self.radius})" 
  9.  
  10. ... 
  11. c = Circle(100, 80, 30) 
  12. repr(c) 
  13. # Circle(100, 80, 30) 

除了__repr__,在調用print(實例)時,執行__str__方法也是一個好主意。有了這兩種方法,你可以通過打印你的變量得到很多信息。

針對字典的__missing__方法

如果出于某種原因需要實現自定義dictionary類,那么在嘗試訪問一些實際上不存在的密鑰時,您可能會遇到一些由keyerror引起的錯誤。為了避免在代碼中到處查看丟失了哪個鍵(key),你可以實現特殊的__miss__方法,每次KeyError被提出時調用。

  1. class MyDict(dict): 
  2.     def __missing__(self, key): 
  3.         message = f'{key} not present in the dictionary!' 
  4.         logging.warning(message) 
  5.         return message  # Or raise some error instead 

上面的實現非常簡單,只返回和記錄丟失鍵的消息,但是您還可以記錄其他有價值的信息,以便了解代碼中出現了什么問題。

調試崩潰的應用程序

如果您的應用程序在您有機會了解其中發生了什么之前就崩潰了,那么您可能會發現這個技巧非常有用。

使用-i參數運行應用程序(python3 -i app.py)會導致程序一退出就啟動交互式shell。此時,您可以檢查變量和函數。

如果這還不夠好,您可以帶一個更強大的工具 - pdb - Python調試器。pdb有很多特性,可以單獨寫一篇文章來說明。但這里有一個例子和最重要的部分的綱要。讓我們先看看崩潰腳本:

  1. # crashing_app.py 
  2. SOME_VAR = 42 
  3.  
  4. class SomeError(Exception): 
  5.     pass 
  6.  
  7. def func(): 
  8.     raise SomeError("Something went wrong...") 
  9.  
  10. func() 

現在,如果我們用-i參數運行它,我們就有機會調試它:

  1. # Run crashing application 
  2. ~ $ python3 -i crashing_app.py 
  3. Traceback (most recent call last): 
  4.   File "crashing_app.py", line 9, in <module> 
  5.     func() 
  6.   File "crashing_app.py", line 7, in func 
  7.     raise SomeError("Something went wrong...") 
  8. __main__.SomeError: Something went wrong... 
  9. >>> # We are interactive shell 
  10. >>> import pdb 
  11. >>> pdb.pm()  # start Post-Mortem debugger 
  12. > .../crashing_app.py(7)func() 
  13. -> raise SomeError("Something went wrong...") 
  14. (Pdb) # Now we are in debugger and can poke around and run some commands: 
  15. (Pdb) p SOME_VAR  # Print value of variable 
  16. 42 
  17. (Pdb) l  # List surrounding code we are working with 
  18.   2      
  19.   3     class SomeError(Exception): 
  20.   4         pass 
  21.   5      
  22.   6     def func(): 
  23.   7  ->     raise SomeError("Something went wrong...") 
  24.   8      
  25.   9     func() 
  26. [EOF] 
  27. (Pdb)  # Continue debugging... set breakpoints, step through the code, etc. 

上面的調試會話非常簡單地展示了使用pdb可以做什么。程序結束后,我們進入交互式調試會話。首先,導入pdb并啟動調試器。此時,我們可以使用所有pdb命令。作為上面的示例,我們使用p命令打印變量,使用l命令列出代碼。大部分時間你可能會想要設置斷點,可以與b LINE_NO和運行程序,直到斷點(c),然后繼續與年代,逐頁瀏覽功能的選擇可能與w。

堆棧跟蹤

假設您的代碼是運行在遠程服務器上的Flask或Django應用程序,在那里您無法獲得交互式調試會話。在這種情況下,你可以使用traceback和sys包來了解你的代碼中失敗的地方:

  1. import traceback 
  2. import sys 
  3.  
  4. def func(): 
  5.     try: 
  6.         raise SomeError("Something went wrong...") 
  7.     except: 
  8.         traceback.print_exc(file=sys.stderr) 

在運行時,上面的代碼將打印引發的最后一個異常。除了打印異常,您還可以使用traceback包來打印stacktrace (traceback. print_stack())或提取原始堆棧幀,格式化它并進一步檢查它(traceback. format_list(traceback.extract_stack()))。

在調試期間重新加載模塊

有時,您可能在交互式shell中調試或試驗某些函數,并經常對其進行更改。為了使運行/測試和修改的循環更容易,您可以運行importlib.reload(模塊),以避免在每次更改后重新啟動交互會話:

  1. >>> import func from module 
  2. >>> func() 
  3. "This is result..." 
  4.  
  5. # Make some changes to "func" 
  6. >>> func() 
  7. "This is result..."  # Outdated result 
  8. >>> from importlib import reload; reload(module)  # Reload "module" after changes made to "func" 
  9. >>> func() 
  10. "New result..." 

這個技巧更多的是關于效率而不是調試。能夠跳過一些不必要的步驟,使您的工作流程更快、更高效總是很好的。一般來說,不時地重新加載模塊是一個好主意,因為它可以幫助您避免調試已經被修改了很多次的代碼。

 

責任編輯:趙寧寧 來源: 今日頭條
相關推薦

2023-05-05 17:20:04

2012-08-21 06:53:00

測試軟件測試

2025-03-11 00:54:42

2017-03-27 21:14:32

Linux日志指南

2015-07-20 09:39:41

Java日志終極指南

2024-07-10 09:07:09

2025-07-31 00:00:15

2022-06-30 08:00:00

MySQL關系數據庫開發

2023-05-23 18:31:14

Rust編程

2020-06-24 12:26:28

企業網絡IT管理

2024-08-19 00:40:00

SQL數據庫

2024-09-10 08:26:40

2015-03-05 11:28:51

Linux桌面環境終極指南

2015-11-08 14:44:48

2022-02-09 09:00:00

云計算BigQuerySnowflake

2024-05-17 09:46:17

Python單元測試unittest模塊

2024-02-23 18:59:32

Python函數編程

2013-12-18 09:36:08

企業移動指南

2022-07-22 13:14:57

TypeScript指南

2024-05-17 10:59:25

云計算谷歌云
點贊
收藏

51CTO技術棧公眾號

日韩欧美a级片| 天堂av手机在线| 日本啊v在线| 久久成人在线| 日韩在线免费视频| 日本少妇一区二区三区| а√在线中文在线新版| 欧美国产在线观看| dy888夜精品国产专区| 日本在线小视频| 欧美色就是色| 精品久久国产字幕高潮| 国产又粗又长又大的视频| av片哪里在线观看| 久久久久久久免费视频了| 成人亲热视频网站| 欧美性猛交bbbbb精品| 国产精品国产一区| 日韩精品视频免费在线观看| 日韩一区二区三区不卡视频| 91高清视频在线观看| 国产精品毛片无遮挡高清| 国产精品伊人日日| 伊人网av在线| 国产日韩1区| 久久精品色欧美aⅴ一区二区| 亚洲成人精品在线播放| 亚洲精品.com| 亚洲va在线va天堂| 国产又黄又爽免费视频| 日本天堂影院在线视频| 国产黄色成人av| 国产精品日韩av| 天天操天天干视频| 欧美日韩久久| 精品国偷自产在线视频99| 少妇大叫太粗太大爽一区二区| 精品国产一区二区三区性色av| 色伊人久久综合中文字幕| 欧美黄色免费网址| 国产素人视频在线观看| 国产农村妇女毛片精品久久麻豆 | 老牛影视精品| 亚洲视频一二三区| 亚洲砖区区免费| 欧美xxx.com| 成+人+亚洲+综合天堂| 亚洲伊人一本大道中文字幕| 一区二区三区麻豆| 久久亚洲影院| 欧美一级片在线播放| 久久精品视频9| 欧美精品播放| 久久不射电影网| 欧洲美女女同性互添| 欧美自拍偷拍| 国产亚洲精品激情久久| 免费看黄色aaaaaa 片| 精品伊人久久久| 亚洲国产成人av在线| av漫画在线观看| 97品白浆高清久久久久久| 日韩久久久久久| 女同性αv亚洲女同志| 免费观看亚洲天堂| 日韩免费成人网| 任你躁av一区二区三区| jizz性欧美23| 亚洲国产精品美女| 青青草视频播放| 亚洲三级性片| 国产一区二区三区精品久久久| 国产中年熟女高潮大集合| 国产伦精品一区二区三区视频| 亚洲人成在线免费观看| 国产精品美女高潮无套| 日韩欧美一区二区三区免费看| 中文精品99久久国产香蕉| 免费一级黄色录像| 999成人精品视频线3| 久久99精品久久久久久琪琪| 精品在线视频观看| 国产精品一二| 国产精品成人品| 一卡二卡三卡在线| 国产福利不卡视频| 麻豆成人小视频| 国产女主播在线直播| 国产精品久久久久aaaa樱花| 亚洲五码在线观看视频| 欧美aa一级| 色88888久久久久久影院野外| 午夜两性免费视频| 99ri日韩精品视频| 亚洲性生活视频在线观看| 日韩激情综合网| 狠狠入ady亚洲精品经典电影| 91精品国产99| 一级黄色大片免费| 成人免费视频网站在线观看| 欧美亚洲免费在线| 国产最新在线| 黄色一区二区在线| 亚洲黄色av片| 老司机在线精品视频| 一本久久综合亚洲鲁鲁| 乱h高h女3p含苞待放| 免费视频一区| 亚洲直播在线一区| 久青青在线观看视频国产| 亚洲欧美另类图片小说| 国产三区在线视频| 日韩有吗在线观看| 在线播放国产一区二区三区| www.天天色| 捆绑调教美女网站视频一区| 国产一区二区三区四区五区在线| 香蕉视频免费在线播放| 精品久久久中文| 亚洲一二三不卡| 国产一区二区三区四区| 97国产精品久久| 国产精品自产拍| 久久视频一区二区| 热久久最新网址| 成人全视频免费观看在线看| 亚洲国产日韩一区| 欧美极品aaaaabbbbb| 免费久久99精品国产| 久久波多野结衣| 欧洲精品二区| 在线成人免费视频| 阿v天堂2014| 国产日韩欧美| 国产三级精品在线不卡| 成人日韩欧美| 欧美日韩成人综合天天影院| 免费人成又黄又爽又色| 性色一区二区三区| 国产精品中出一区二区三区| www在线免费观看视频| 欧美三级乱人伦电影| 色婷婷av777| 亚洲一区一卡| 国产亚洲精品自在久久| 肉体视频在线| 日韩欧美一二三四区| 国产精品成人69xxx免费视频| 日韩avvvv在线播放| 欧美自拍资源在线| 欧美动物xxx| 亚洲人a成www在线影院| 欧美精品韩国精品| 26uuu另类欧美亚洲曰本| 黄色av网址在线播放| 粉嫩av一区二区| 久久久久久久久久久网站| 亚洲第一色视频| 洋洋成人永久网站入口| 免费欧美一级片| 一区精品久久| 国产一区二区精品在线| 忘忧草在线日韩www影院| 日韩国产欧美精品在线 | 久久久久蜜桃| 成人精品视频久久久久| 超碰在线观看免费版| 日韩一级成人av| 欧美精品一区二区成人| 丰满亚洲少妇av| 丁香六月激情婷婷| 你微笑时很美电视剧整集高清不卡| 茄子视频成人在线| 国产福利在线| 欧美肥胖老妇做爰| 久久高清无码视频| 99久精品国产| 欧美一级黄色影院| 色999日韩| 产国精品偷在线| 黄频免费在线观看| 在线观看日韩视频| 99久久精品无免国产免费| 亚洲综合色丁香婷婷六月图片| 波多野结衣加勒比| 老牛国产精品一区的观看方式| 亚洲福利av| 欧美精品三级在线| 欧美在线免费视频| 色网站免费在线观看| 欧美精品一区二区三| 波多野结衣啪啪| 亚洲欧洲精品一区二区三区| 黄色激情在线观看| 首页国产欧美日韩丝袜| 国产福利片一区二区| 黄色网一区二区| 国产精品久久久久av| 亚洲国产精品精华素| 日韩精品一区二区视频| 国产美女免费视频| 日韩欧美第一页| 欧美成人777| 久久一日本道色综合| 亚洲国产欧美91| 久久国产精品99国产| 天堂av免费看| 美女久久99| 91精品免费| 日韩国产网站| 午夜精品久久久久久久久久久久久| 第九色区av在线| 亚洲成人1234| 一女二男一黄一片| 91久久国产综合久久| 欧美成人三级在线观看| 国产婷婷色一区二区三区| 日本少妇xxxx软件| 激情久久五月天| 国产二区视频在线播放| 中文字幕一区二区精品区| 欧美一区二区视频在线| 久久动漫网址| 亚洲一区二区久久久久久| 三级成人在线| 91精品国产亚洲| 深夜国产在线播放| 日韩在线不卡视频| 精品亚洲综合| 日韩精品小视频| 日韩中文字幕观看| 日韩精品一区二区三区swag| 一区二区视频播放| 色呦呦网站一区| 日产精品久久久| 亚洲国产精品自拍| 免费视频网站www| 亚洲天堂网中文字| 国产喷水在线观看| 国产精品午夜免费| 懂色av蜜桃av| 国产日产欧产精品推荐色| 精品中文字幕在线播放| 国产精品99精品久久免费| 午夜天堂在线视频| 久久97超碰国产精品超碰| av五月天在线| 肉肉av福利一精品导航| 久久精品99国产| 亚洲综合不卡| www.爱色av.com| 一区二区高清| 亚洲熟妇无码一区二区三区导航| 国内在线观看一区二区三区| 欧美做受777cos| 中文字幕日韩欧美精品高清在线| 一道精品一区二区三区| 99久久99久久精品国产片果冰| 亚洲韩国在线| 欧美xxxx中国| 伊人久久婷婷色综合98网| 日韩三级在线| 国产日本欧美在线| 一本一道久久a久久精品蜜桃| 浴室偷拍美女洗澡456在线| 亚洲xxx拳头交| 99re6这里有精品热视频| 国产精品扒开腿做爽爽爽软件| 高清欧美精品xxxxx| 在线亚洲成人| 国产自偷自偷免费一区| 青青草国产精品97视觉盛宴| 日韩av在线中文| 国产米奇在线777精品观看| 精品国产aⅴ一区二区三区东京热 久久久久99人妻一区二区三区 | 日本最新高清不卡中文字幕| 亚洲第一影院| 国产日韩欧美在线看| 成人永久在线| 国产精品yjizz| 奇米狠狠一区二区三区| 亚洲一区尤物| 欧美成人一品| 国产一区二区视频播放| 日韩激情视频网站| 91网址在线观看精品| 不卡视频在线看| 无码一区二区三区在线| 亚洲视频精选在线| 欧美三级一区二区三区| 欧美三级在线播放| 亚洲乱码在线观看| 亚洲欧美激情一区| h片在线免费| 欧美中文在线视频| 99精品美女视频在线观看热舞| 国产69精品久久久久9999apgf| 久久99青青| 97在线免费视频观看| 久久综合图片| 年下总裁被打光屁股sp | 国产免费一区二区三区| av伊人久久| 日韩小视频网站| 日本最新不卡在线| 折磨小男生性器羞耻的故事| 国产视频不卡一区| 久久精品免费在线| 在线播放一区二区三区| 午夜视频www| 久久久精品久久| 丝袜美腿一区| 成人av中文| 日韩亚洲一区在线| 久久久999免费视频| 国产精品自拍毛片| 亚洲一区 欧美| 姬川优奈aav一区二区| 国产成人精品免费看视频| 亚洲色图13p| a国产在线视频| 99视频在线播放| 日韩综合在线| 国产精品亚洲a| 成人黄色小视频在线观看| 91久久久久久久久久久久久久| 色婷婷av一区二区三区软件 | 丝袜亚洲另类丝袜在线| 在线中文字日产幕| 亚洲欧美日本在线| 在线观看国产精品视频| 日韩久久免费视频| heyzo一区| 成人欧美一区二区三区视频xxx| 日韩精品免费一区二区在线观看| 精品人妻一区二区三区四区在线| 国产成人免费视频网站高清观看视频| 日本成人精品视频| 欧美色窝79yyyycom| 成人在线播放视频| 国产成人精品日本亚洲| 欧美日韩夜夜| 亚洲熟妇无码一区二区三区导航| 国产成人精品亚洲777人妖| 黑鬼狂亚洲人videos| 欧美高清一级片在线| 日本中文字幕视频在线| 国产精品美女www| 欧美欧美黄在线二区| 免费观看精品视频| 久久嫩草精品久久久久| 东京热一区二区三区四区| 亚洲精品少妇网址| 偷拍精品精品一区二区三区| 九九九九九精品| 先锋影音久久久| 国产熟妇搡bbbb搡bbbb| 91黄色免费网站| аⅴ资源新版在线天堂| 国产精品揄拍500视频| 久久资源中文字幕| 手机av在线网站| 亚洲美女精品一区| 亚洲AV午夜精品| 久久久久久久久久久91| 国产wwwwwww| 国产揄拍国内精品对白| 巨胸大乳www视频免费观看| 欧美色另类天堂2015| 国产日本在线| 国产免费一区视频观看免费| 999精品视频| 国产成人精品一区二区三区在线观看 | 亚洲美腿欧美偷拍| 嫩草影院一区二区| 日本精品va在线观看| 九九精品久久| 午夜免费看毛片| 有码一区二区三区| 天堂av电影在线观看| 国产精品91视频| 97久久夜色精品国产| 制服.丝袜.亚洲.中文.综合懂| 午夜一区二区三区视频| 韩国三级在线观看久| 国产免费观看久久黄| 欧美激情无毛| 色欲av无码一区二区三区| 欧美日韩久久久一区| 青青草原国产在线| 欧美日韩在线观看一区二区三区| 美腿丝袜一区二区三区| 欧美日韩成人免费观看| 亚洲精品一区二区在线| www 久久久| 国产女大学生av| 18成人在线观看| 四虎在线视频| 成人在线视频网站| 亚洲一区二区三区免费在线观看|