成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

PythonDebug調(diào)試的方法是什么

本篇內(nèi)容主要講解“Python Debug調(diào)試的方法是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Python Debug調(diào)試的方法是什么”吧!

網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、小程序制作、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了青龍免費(fèi)建站歡迎大家使用!

日志是必須的

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

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

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

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

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

version: 1 disable_existing_loggers: true  formatters:   standard:     format: "[%(asctime)s] {%(pathname)s:%(lineno)d} %(levelname)s - %(message)s"     datefmt: '%H:%M:%S'  handlers:   console:  # handler which will log into stdout     class: logging.StreamHandler     level: DEBUG     formatter: standard  # Use formatter defined above     stream: ext://sys.stdout   file:  # handler which will log into file     class: logging.handlers.RotatingFileHandler     level: WARNING     formatter: standard  # Use formatter defined above     filename: /tmp/warnings.log     maxBytes: 10485760 # 10MB     backupCount: 10     encoding: utf8  root:  # Loggers are organized in hierarchy - this is the root logger config   level: ERROR   handlers: [console, file]  # Attaches both handler defined above  loggers:  # Defines descendants of root logger   mymodule:  # Logger for "mymodule"     level: INFO     handlers: [file]  # Will only use "file" handler defined above     propagate: no  # Will not propagate logs to "root" logger

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

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

import yaml from logging import config  with open("config.yaml", 'rt') as f:     config_data = yaml.safe_load(f.read())     config.dictConfig(config_data)

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

__repr__ 可讀的日志

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

class Circle:     def __init__(self, x, y, radius):         self.x = x         self.y = y         self.radius = radius      def __repr__(self):         return f"Rectangle({self.x}, {self.y}, {self.radius})"  ... c = Circle(100, 80, 30) repr(c) # Circle(100, 80, 30)

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

針對字典的__missing__方法

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

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

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

調(diào)試崩潰的應(yīng)用程序

如果您的應(yīng)用程序在您有機(jī)會了解其中發(fā)生了什么之前就崩潰了,那么您可能會發(fā)現(xiàn)這個技巧非常有用。

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

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

# crashing_app.py SOME_VAR = 42  class SomeError(Exception):     pass  def func():     raise SomeError("Something went wrong...")  func()

現(xiàn)在,如果我們用-i參數(shù)運(yùn)行它,我們就有機(jī)會調(diào)試它:

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

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

堆棧跟蹤

假設(shè)您的代碼是運(yùn)行在遠(yuǎn)程服務(wù)器上的Flask或Django應(yīng)用程序,在那里您無法獲得交互式調(diào)試會話。在這種情況下,你可以使用traceback和sys包來了解你的代碼中失敗的地方:

import traceback import sys  def func():     try:         raise SomeError("Something went wrong...")     except:         traceback.print_exc(file=sys.stderr)

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

在調(diào)試期間重新加載模塊

有時,您可能在交互式shell中調(diào)試或試驗(yàn)?zāi)承┖瘮?shù),并經(jīng)常對其進(jìn)行更改。為了使運(yùn)行/測試和修改的循環(huán)更容易,您可以運(yùn)行importlib.reload(模塊),以避免在每次更改后重新啟動交互會話:

>>> import func from module >>> func() "This is result..."  # Make some changes to "func" >>> func() "This is result..."  # Outdated result >>> from importlib import reload; reload(module)  # Reload "module" after changes made to "func" >>> func() "New result..."

到此,相信大家對“Python Debug調(diào)試的方法是什么”有了更深的了解,不妨來實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

網(wǎng)站標(biāo)題:PythonDebug調(diào)試的方法是什么
網(wǎng)站路徑:http://jinyejixie.com/article46/ppishg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動網(wǎng)站建設(shè)、網(wǎng)站內(nèi)鏈靜態(tài)網(wǎng)站、外貿(mào)建站、動態(tài)網(wǎng)站、小程序開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)
和田县| 茶陵县| 南华县| 东辽县| 庆元县| 中江县| 汕尾市| 浦城县| 沛县| 奈曼旗| 车致| 赤水市| 漯河市| 安平县| 衡阳县| 寿阳县| 兴山县| 云林县| 江都市| 潼南县| 龙井市| 榆林市| 精河县| 延吉市| 郸城县| 古浪县| 洛浦县| 保定市| 盖州市| 宁海县| 乾安县| 房产| 门头沟区| 连江县| 临朐县| 彭泽县| 新乡县| 青冈县| 玉龙| 宾阳县| 含山县|