直接在源文件中編寫Jython代碼
Jython解釋器對于快速檢查和作提示都很方便,但您不必在這其中完成所有工作 ― Jython 還允許您在源文件中編寫代碼,并隨后運行該代碼(雖然使用 Jython 時,編譯步驟是可選的)。以下清單是一個獨立 Jython程序的示例:
清單 7. 模擬硬幣投擲的樣本 Jython程序(listing7.py)
- from java.util import Random
- rng = Random()
- #This is a comment in Jython
- print "Flipping a coin..."
- if rng.nextBoolean():
- print "Came up heads"
- else:
- print "Came up tails"
在解釋如何運行該代碼之前,讓我們先解釋一下代碼。這個示例引入了 Jython 中的 if 語句,這是有些人對 Jython(及其先輩 Python)評論的首要方面之一。沒有字符定界符標記出當 if 語句條件為真時要執(zhí)行的代碼塊(Jython 中的條件不需要括起的圓括號,這與 Java 編程一樣)。只是這些代碼比周圍的代碼縮進一層。
Jython代碼塊總是使用縮進進行標記,而不是使用其它標記,例如花括號。引入代碼塊的語句(例如 if )以冒號作為結(jié)尾。Jython 的這個特性意味著在編寫代碼時必須小心,因為縮進代碼的方式實際上可能會改變代碼的含義。例如,清單 8a 產(chǎn)生的打印輸出只有數(shù)字 3,因為它上面兩個語句都屬于其條件永遠不為真的 if 塊:
清單 8a. Jython代碼的縮進:只打印“3”
- if 0:
- print "1"
- print "2"
- print "3"
如果我只更改其中一行的縮進,那么就會打印數(shù)字 2和數(shù)字 3:
清單 8b. Jython代碼的縮進:打印“2”和“3”
- if 0:
- print "1"
- print "2"
- print "3"
縮進還必須一致,它必須與將代碼組織成塊的語句相關(guān)聯(lián),而且通常它還必須控制代碼流。例如:
清單 8c. Jython代碼的縮進:語法錯誤
- print "1"
- print "2"
- print "3"
這只會產(chǎn)生一個語法錯誤,因為沒有任何控制語句要求將一個塊與代碼其余部分相分離。
使用縮進標記代碼塊是 Python 和 Jython 的更有爭議的特性之一,但我認為這個問題常常被夸大了。畢竟,如果您遵循有關(guān)縮進的良好的編碼標準,就不應(yīng)該有這種問題。如果遵循了良好的編碼縮進,那么機器會執(zhí)行,同行評論家就無話可說,因此事實勝于雄辯。
此外,我知道當開發(fā)人員對這種語言使用一段時間后,沒有誰會注意這種限制。適當縮進成為 Jython 的第二本性。縮進和語法之間的這種聯(lián)系當然可能會引起以前未遇到過的錯誤,但是沒有顯式的定界符也消除了使用這些定界符的語言中的某些常見錯誤。
您可以不必編譯就可運行 清單 7 中的文件(listing7.py),只需將該文件名作為 jython 命令的參數(shù)來調(diào)用,如下所示:
清單 9. 不編譯就運行“硬幣投擲”
- $ jython listing7.py
- Flipping a coin...
- Came up tails
- $
在上個示例中, $ 就是 UNIX shell 提示符,它非常象 Windows 系統(tǒng)上的 C:\> 。您還可以使用 jpythonc 命令將模塊編譯成 Java 字節(jié)碼( .class )文件,該命令允許您使用 java 或 jre 命令直接運行它。用這種方法編譯的 Jython 模塊有一些限制,但這個問題超出了本文的范圍。
【編輯推薦】