第七章是講 Exception handling

Java 跟 Python 比較大的差異,一個是 throw,一個是 raise;再者,Java 會在成員函式加上 throw,表示這個函式會丟出 Exception,編譯器就會強制使用的地方得加上 try-catch 去處理,Python 則是沒有強制規定;Python 有多一個 else,try-except-else ,可以用來處理沒有例外發生時的情況。

除了在 except 接例外時,可以得知是什麼例外之外,也可以用 sys.exc_info() 取得是什麼例外。

except 一次接兩個或更多例外的寫法:except (NameError, ZeroDivisionError), err:

warnings module,可以讓程式提出一些警告,讓開發者瞭解程式的用法可能過時或是有誤等等的。warnings 也是有層級,可以透過 filters/showwarning 以及 category 參數來設定出現哪些層級的警告。這在設計 module 時會蠻需要的。(PYMOTW 範例)

assert 的用法與 C 相似,但卻是直接丟出 AssertionError 例外。

第七章的最後是回頭介紹前面帶過的 ContextLib 。一般在處理檔案或資料庫關閉,可能會利用 try-finally ,在 finally 裡去確保檔案或資料庫有關閉,在 2.5 以後有引進 with 敘述,with 可以將這種情況處理的更優雅。搭配 with 時,可以在類別裡增加 __enter__/__exit__ method 以配合處理。可是這邊就沒有特別提到 contextlib.closing() ,這到底是??

第八章介紹 module 以及 import,這邊看到一個用法,是我之前沒看過的:from . import submodule / from .. import submodule / from .module import submodule / from ..module import submodule ,作者是建議除了 from . import submodule 之外,後面幾種都不要用。

在 module 要隱藏類別或函式的話,就要定義 __all__ = [ "func1", "func2" ],明確的表示 module 提供了哪些類別或函式。

在搜尋 module 時,Jython 會同時搜索 CLASSPATH 與 sys.path。Jython 另外會去讀取 python.packages.paths , python.packages.directories , java.class.path 與 java.ext.dirs 這幾個 property (透過 System.setProperty) 以作為判斷。

使用 module 時,很重要的一件事情。Jython 在找 Python module 時,如果遇到同名的 module,他只用第一個找到的 module;在找 Java packages 時,如果遇到同名的,那麼會 merge 起來;那如果 Python module 跟 Java package 有同名情況時,那就看優先順序了。是故,在命名上,不要用 Java 慣例,就是 url reverse 的方式,以免踩到地雷。

Jython 獨有的 module:import pycimport 。在 import 以後,Jython 會搜索所有 *.pyc 放到 sys.path 裡,之後當你 import 時,會直接使用這個已經被 CPython 解譯過的 .pyc 檔案(裡面是 CPython byte code),而不重新解譯過。Jython 內部的處理手法是利用 sys.meta_path。

更多有關 The Definitive Guide to Jython: Python for the Java Platform 的事情
arrow
arrow

    elleryq 發表在 痞客邦 留言(0) 人氣()