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