新聞中心
python 開(kāi)發(fā)模式
3.7 新版功能.

成都創(chuàng)新互聯(lián)專注于市中企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站開(kāi)發(fā),購(gòu)物商城網(wǎng)站建設(shè)。市中網(wǎng)站建設(shè)公司,為市中等地區(qū)提供建站服務(wù)。全流程按需網(wǎng)站開(kāi)發(fā),專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,成都創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)
開(kāi)發(fā)模式下的 Python 加入了額外的運(yùn)行時(shí)檢查,由于開(kāi)銷太大,并非默認(rèn)啟用的。如果代碼能夠正確執(zhí)行,默認(rèn)的調(diào)試級(jí)別足矣,不應(yīng)再提高了;僅當(dāng)覺(jué)察到問(wèn)題時(shí)再提升警告觸發(fā)的級(jí)別。
使用 -X dev 命令行參數(shù)或?qū)h(huán)境變量 PYTHONDEVMODE 置為 1 ,可以啟用開(kāi)發(fā)模式。
另請(qǐng)參考 Python debug build 。
Python 開(kāi)發(fā)模式的效果
啟用 Python 開(kāi)發(fā)模式后的效果,與以下命令類似,不過(guò)還有下面的額外效果:
PYTHONMALLOC=debug PYTHONASYNCIODEBUG=1 Python3 -W default -X faulthandler
Python 開(kāi)發(fā)模式的效果:
-
加入
defaultwarning filter 。下述警告信息將會(huì)顯示出來(lái):-
DeprecationWarning
-
ImportWarning
-
PendingDeprecationWarning
-
ResourceWarning
通常上述警告是由默認(rèn)的 warning filters 負(fù)責(zé)處理的。
效果類似于采用了 -W default 命令行參數(shù)。
使用命令行參數(shù) -W error 或?qū)h(huán)境變量 PYTHONWARNINGS 設(shè)為
error,可將警告視為錯(cuò)誤。 -
-
在內(nèi)存分配程序中安裝調(diào)試鉤子,用以查看:
-
緩沖區(qū)下溢
-
緩沖區(qū)上溢
-
內(nèi)存分配 API 沖突
-
不安全的 GIL 調(diào)用
參見(jiàn) C 函數(shù) PyMem_SetupDebugHooks() 。
效果如同將環(huán)境變量 PYTHONMALLOC 設(shè)為
debug。若要啟用 Python 開(kāi)發(fā)模式,卻又不要在內(nèi)存分配程序中安裝調(diào)試鉤子,請(qǐng)將 環(huán)境變量 PYTHONMALLOC 設(shè)為
default。 -
-
在啟動(dòng) Python 時(shí)調(diào)用 faulthandler.enable() ,會(huì)安裝
SIGSEGV、SIGFPE、SIGABRT、SIGBUS和SIGILL信號(hào)的處理程序,以便在程序崩潰時(shí)將 Python 跟蹤信息轉(zhuǎn)儲(chǔ)下來(lái)。其行為如同使用了 -X faulthandler 命令行選項(xiàng)或?qū)?PYTHONFAULTHANDLER 環(huán)境變量設(shè)為
1。 -
啟用 asyncio debug mode。比如 asyncio 會(huì)檢查沒(méi)有等待的協(xié)程并記錄下來(lái)。
效果如同將環(huán)境變量 PYTHONASYNCIODEBUG 設(shè)為
1。 -
檢查字符串編碼和解碼函數(shù)的 encoding 和 errors 參數(shù)。例如: open() 、 str.encode() 和 bytes.decode()。
為了獲得最佳性能,默認(rèn)只會(huì)在第一次編碼/解碼錯(cuò)誤時(shí)才會(huì)檢查 errors 參數(shù),有時(shí) encoding 參數(shù)為空字符串時(shí)還會(huì)被忽略。
-
io.IOBase 的析構(gòu)函數(shù)會(huì)記錄
close()觸發(fā)的異常。 -
將 sys.flags 的
dev_mode屬性設(shè)為True。
Python 開(kāi)發(fā)模式下,默認(rèn)不會(huì)啟用 tracemalloc 模塊,因?yàn)槠湫阅芎蛢?nèi)存開(kāi)銷太大。啟用 tracemalloc 模塊后,能夠提供有關(guān)錯(cuò)誤來(lái)源的一些額外信息。例如,ResourceWarning 記錄了資源分配的跟蹤信息,而緩沖區(qū)溢出錯(cuò)誤記錄了內(nèi)存塊分配的跟蹤信息。
Python 開(kāi)發(fā)模式不會(huì)阻止命令行參數(shù) -O 刪除 assert 語(yǔ)句,也不會(huì)阻止將 __debug__ 設(shè)為 False。
Python 開(kāi)發(fā)模式只能在 Python 啟動(dòng)時(shí)啟用。其參數(shù)值可從 sys.flags.dev_mode 讀取。
在 3.8 版更改: 現(xiàn)在, io.IOBase 的析構(gòu)函數(shù)會(huì)記錄 close() 觸發(fā)的異常。
在 3.9 版更改: 現(xiàn)在,字符串編碼和解碼操作時(shí)會(huì)檢查 encoding 和 errors 參數(shù)。
ResourceWarning 示例
以下示例將統(tǒng)計(jì)由命令行指定的文本文件的行數(shù):
import sysdef main():fp = open(sys.argv[1])nlines = len(fp.readlines())print(nlines)# The file is closed implicitlyif __name__ == "__main__":main()
上述代碼沒(méi)有顯式關(guān)閉文件。默認(rèn)情況下,Python 不會(huì)觸發(fā)任何警告。下面用 README.txt 文件測(cè)試下,有 269 行:
$ python3 script.py README.txt269
啟用 Python 開(kāi)發(fā)模式后,則會(huì)顯示一條 ResourceWarning 警告:
$ python3 -X dev script.py README.txt269script.py:10: ResourceWarning: unclosed file <_io.TextIOWrapper name='README.rst' mode='r' encoding='UTF-8'>main()ResourceWarning: Enable tracemalloc to get the object allocation traceback
啟用 tracemalloc 后,則還會(huì)顯示打開(kāi)文件的那行代碼:
$ python3 -X dev -X tracemalloc=5 script.py README.rst269script.py:10: ResourceWarning: unclosed file <_io.TextIOWrapper name='README.rst' mode='r' encoding='UTF-8'>main()Object allocated at (most recent call last):File "script.py", lineno 10main()File "script.py", lineno 4fp = open(sys.argv[1])
修正方案就是顯式關(guān)閉文件。下面用上下文管理器作為示例:
def main():# Close the file explicitly when exiting the with blockwith open(sys.argv[1]) as fp:nlines = len(fp.readlines())print(nlines)
未能顯式關(guān)閉資源,會(huì)讓資源打開(kāi)時(shí)長(zhǎng)遠(yuǎn)超預(yù)期;在退出 Python 時(shí)可能會(huì)導(dǎo)致嚴(yán)重問(wèn)題。這在 CPython 中比較糟糕,但在 PyPy 中會(huì)更糟。顯式關(guān)閉資源能讓?xiě)?yīng)用程序更加穩(wěn)定可靠。
文件描述符錯(cuò)誤示例
顯示自身的第一行代碼:
import osdef main():fp = open(__file__)firstline = fp.readline()print(firstline.rstrip())os.close(fp.fileno())# The file is closed implicitlymain()
默認(rèn)情況下,Python 不會(huì)觸發(fā)任何警告:
$ python3 script.pyimport os
在 Python 開(kāi)發(fā)模式下,會(huì)在析構(gòu)文件對(duì)象時(shí)顯示 ResourceWarning 并記錄 “Bad file descriptor” 錯(cuò)誤。
$ python3 script.pyimport osscript.py:10: ResourceWarning: unclosed file <_io.TextIOWrapper name='script.py' mode='r' encoding='UTF-8'>main()ResourceWarning: Enable tracemalloc to get the object allocation tracebackException ignored in: <_io.TextIOWrapper name='script.py' mode='r' encoding='UTF-8'>Traceback (most recent call last):File "script.py", line 10, inmain()OSError: [Errno 9] Bad file descriptor
os.close(fp.fileno()) 會(huì)關(guān)閉文件描述符。當(dāng)文件對(duì)象析構(gòu)函數(shù)試圖再次關(guān)閉文件描述符時(shí)會(huì)失敗,并觸發(fā) Bad file descriptor 錯(cuò)誤。每個(gè)文件描述符只允許關(guān)閉一次。在最壞的情況下,關(guān)閉兩次會(huì)導(dǎo)致程序崩潰(示例可參見(jiàn) bpo-18748 )。
修正方案是刪除 os.close(fp.fileno()) 這一行,或者打開(kāi)文件時(shí)帶上 closefd=False 參數(shù)。
網(wǎng)頁(yè)題目:創(chuàng)新互聯(lián)Python教程:Python開(kāi)發(fā)模式
轉(zhuǎn)載源于:http://fisionsoft.com.cn/article/dhijeee.html


咨詢
建站咨詢
