2015-06-25 120 views
19

我發現下面的構造今天別人的代碼:定義的確,如果沒有定義,導致語法錯誤

try: True, False 
except NameError: True = 1==1; False = 1==0 

據我瞭解這一點,它定義TrueFalse如果它們尚未確定。所以如果他們被定義,它不應該拋出NameError -Exception,對吧?

我在一個shell tr​​yed這對我自己和它表明我SyntaxError: can't assign to keyword

我的問題是爲什麼,如果真和假的定義甚至開槍語法錯誤?如果True和False在我的系統上可用,它不應該超過異常處理並且不顯示語法錯誤嗎?

+8

這些行使得代碼與python 2.3之前的版本兼容。 (請參閱[PEP 285](https://www.python.org/dev/peps/pep-0285/))。但是* nobody *使用python <2.3,甚至python <2.5真的很少見。目前您最好嘗試使代碼可移植到python2.7/3 + – Bakuriu

+0

http://2ndscale.com/rtomayko/2003/TrueFalseInOldPython – 101

回答

22

此代碼是爲Python 2.x編寫的,不適用於Python 3.x(其中TrueFalse是真正的關鍵字)。

由於TrueFalse是Python 3中的關鍵字,因此您將得到一個您無法捕捉的SyntaxError

此代碼的存在是因爲Python的非常舊的版本。在Python 2.2(2001年發佈!)中,TrueFalse不作爲預定義的名稱存在,所以此代碼將提供兼容的定義,以便後面的代碼可以簡單地使用TrueFalse

將Python 2.x代碼轉換爲Python 3.x時,請刪除這些行;它們是歷史性的,在Python 3.x中沒有用處。如果你看到別人的幾行代碼,他們是一個明確的信號,這一項目是不寫或移植的Python 3

+1

「它們肯定表明該程序未針對Python 3編寫或移植」 - 或者這個年齡段的任何Python版本... xD – poke

+0

他們用什麼來代替?用於布爾邏輯的int? – Caramiriel

+1

是的,他們使用1和0.請注意,在Python 2.2.1中,「True」和「False」被添加爲常量,但它們分別被簡單地定義爲「1」和「0」。實際的'bool'類型僅在Python 2.3中通過[PEP 285](https://docs.python.org/2.3/whatsnew/section-bool.html)添加。 – nneonneo

9

SyntaxError在字節編譯階段出現,在代碼運行之前 - 所以你不能用try/except解決它。