假設我有下面的代碼在Python:爲什麼Python在執行前沒有發現錯誤?
a = "WelcomeToTheMachine"
if a == "DarkSideOfTheMoon":
awersdfvsdvdcvd
print "done!"
爲什麼沒有這個錯誤?它甚至如何編譯?在Java或C#中,這將在編譯期間被發現。
假設我有下面的代碼在Python:爲什麼Python在執行前沒有發現錯誤?
a = "WelcomeToTheMachine"
if a == "DarkSideOfTheMoon":
awersdfvsdvdcvd
print "done!"
爲什麼沒有這個錯誤?它甚至如何編譯?在Java或C#中,這將在編譯期間被發現。
Python不是一種編譯語言,這就是爲什麼你的代碼不會拋出編譯錯誤。
Python是一種字節碼解釋語言。從技術上講,源代碼被「編譯」爲字節碼,但是如果使用PyPy或Pyston,則字節碼恰好在時間上(JIT)編譯,否則就是逐行解釋。
的工作流程如下:
Python代碼 - >編譯 - >.pyc文件文件 - >解釋 - >你的輸出
使用標準的Python運行時是什麼意思?實質上,所有繁重的工作都是在運行時發生的,與使用C或C++編譯時將源代碼完整分析並轉換爲二進制文件不同。
這是一個小編譯,實際的語法錯誤實際上是在編譯期間發現的。只是在Python中,運行時會在靜態語言中編譯階段的許多事情發生。 – user2357112
另外,Python的標準實現不會執行JIT。 PyPy做JIT,但大多數人沒有使用PyPy。 – user2357112
在「編譯」期間,python幾乎只檢查你的語法。由於awersdfvsdvdcvd
是一個有效的標識符,直到該行實際執行時纔會引發錯誤。僅僅因爲你使用的是沒有定義的名稱並不意味着它不能在別處被定義...如:
globals()['awersdfvsdvdcvd'] = 1
早些時候在文件中就足以抑制NameError
會發生如果帶有拼寫錯誤的名稱的行被執行。
好的,所以不能只查找全局語句呢?答案是「否」 - 從模塊「foo」,我可以以類似的方式添加到模塊「酒吧」的全局。而python無法知道哪些模塊將被導入,直到它實際運行(我也可以在運行時動態導入模塊)。
注意,多數認爲我提到爲什麼Python作爲一門語言無法給你這些事情的警告的原因涉及到的人做瘋狂搞砸的事情。有一些工具將警告你這些事情(假設你不會做那樣的愚蠢的東西)。我最喜歡的是pylint
,但幾乎任何python linter都應該能夠警告你未定義的變量。如果你將一個linter連接到你的編輯器,大部分時間你可以在你真正運行代碼之前捕獲這些錯誤。
因爲Python是一種解釋型語言。這意味着如果Python的解釋器沒有到達那一行,它不會產生任何錯誤。
這裏'a!=「DarkSideOfTheMoon」',所以if條件的主體永遠不會被執行。 – ytk
相關信息[我如何檢查Python腳本的語法而不執行它?](http://stackoverflow.com/q/4284313) –
因爲在執行前這不是錯誤。 – jonrsharpe