国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

利用一個簡單的例子窺探CPython內(nèi)核的運行機制

2020-02-23 00:27:34
字體:
供稿:網(wǎng)友

我最近花了一些時間在探索CPython,并且我想要在這里分享我的一些冒險經(jīng)歷。Allison Kaptur的excellent guide to getting started with Python internals 有一點啰嗦,我想逐步介紹我自己的探索過程會更加有條理性,這樣也許其他好奇的Python使用者可以跟著一起做。

1.注意到了一些奇怪的事情

一開始,我只是設(shè)置好Nose對一些我寫的Python 3代碼進行測試。當(dāng)我運行這些測試的時候,我得到了一個不可思議的錯誤信息:”TypeError: bad argument type for built-in operation”,這是我之前在這個程序里沒有見到過的。

最終造成這個錯誤的原因有一點顯而易見——我不小心在程序里留了一個PDB斷點(`import pdb; pdb.set_trace()`)。當(dāng)我把它去掉后,測試正常運行了。

但是,我曾經(jīng)使用Nose在Python 2 repos上進行測試,并且在那種情況下,錯誤留下的斷點并不會導(dǎo)致Nose崩潰,而是看上去像是“掛起”了。程序并不是真的掛起了——它僅僅是不顯示東西到stdout(標準輸出)了。Nose是故意這樣做的,而當(dāng)我正在運行一套測試的時候這樣做是有意義的。我可能僅僅是想看測試的結(jié)果,而不是一大堆程序自己打印出來的狀態(tài)。如果你在這個腳本里面敲擊“c”,Nose僅僅像通常那樣經(jīng)過這個斷點。

通常情況下,我可能只是聳聳肩,移除掉這個斷點,然后繼續(xù)我的工作。但是!我在一個黑客學(xué)校并且有時間深入研究任何抓住我興趣的東西,所以我決定利用這次機會去窺探一下Python的內(nèi)核。

2.制造一個最簡單的測試樣例。

結(jié)果這次的問題研究起來有一點復(fù)雜——我并不能確定問題是在Nose,還是PDB或者CPython自己的代碼里面。并且,我當(dāng)然不能使用任何斷點,因為這些斷點會導(dǎo)致我的程序崩潰。

最終,在驗證了一些假設(shè)后,看上去PDB對`input()`的調(diào)用導(dǎo)致了崩潰。所以:在Python2和Python3里面,input的實現(xiàn)有什么不同嗎?或者是其他的某些東西不同?

我和Jesse一起進行調(diào)試,最后我們意識到Nose以一種有趣的方式處理標準輸出:
 

self._buf = StringIO()sys.stdout = self._buf

這里用sys.stout表示Python中的所有標準輸出,即表示所有向終端輸出的內(nèi)容都會發(fā)送到這里。但由于我們可以像訪問其他Python變量那樣訪問sys.stout,所以我們可以改變這個sys.stout。而Nose將sys.stoud設(shè)置為StringIO(),而這只是任意一個字符串。

如果你這么做,print函數(shù)就不會工作了!
 

import sys, iosys.stdout = io.StringIO()print(“Hello”)# Oh no, nothing printed!

我們懷疑是否那一行就是問題所在,所以我們構(gòu)造了一個簡單的測試樣例:
 

import sys, iosys.stdout = io.StringIO()print("Hello!") # Nothing will appearinput("Input: ") # Raises a TypeError            
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 突泉县| 左云县| 鹿邑县| 石景山区| 宁陵县| 漯河市| 太保市| 福泉市| 宁城县| 修文县| 呼和浩特市| 和田市| 西藏| 东海县| 呼图壁县| 平顺县| 车险| 长白| 晋宁县| 浠水县| 南郑县| 广南县| 彭泽县| 东乡县| 张掖市| 祁阳县| 凌源市| 鄂州市| 延川县| 阿鲁科尔沁旗| 堆龙德庆县| 马关县| 太保市| 吉木萨尔县| 曲沃县| 兴化市| 思茅市| 肇东市| 镇雄县| 新巴尔虎左旗| 客服|