1991:0.9.0 首次公開——函式、類別、例外一次到位#
事件#
1991 年 2 月,Guido 在 alt.sources 新聞群組上發佈 Python 0.9.0 原始碼。令人驚訝的是,這個「0.9」版本已經具備完整的語言骨架:函式、類別(class)、例外處理(try/except)、核心資料型別(list、dict、tuple、string)、以及 import 模組系統。
為何重要#
- 起點即是完備語言:不像許多腳本語言(如早期 PHP)一開始只是簡陋的工具,Python 0.9.0 就有多型、繼承、例外——這讓 Python 從第一天就「能寫大程式」。
- alt.sources 開源社群:Guido 公開原始碼並歡迎修改,Python 因此從個人專案變成社群專案;這是 1990 年代初「開源」概念成形前的一次實踐。
理論與實用原因#
- 理論原因:
- 例外處理參考 Modula-3(Guido 在 CWI 接觸過)——與 1975 年的 CLU 語言一脈相承的「以控制流取代錯誤碼檢查」理論。shell/C 時代以回傳值判斷錯誤,容易遺漏;Python 從第一天就提供統一的例外機制。
- 類別參考 Smalltalk(1972) 的訊息傳遞模型,但採用更輕量的語法:一切皆物件,連函式、模組、類別本身都是物件——這是統一資料模型(uniform object model)的實踐。
- 實用原因:Guido 的目標用戶是「會寫 C、但厭倦 C」的系統管理員與科學家——他們需要例外(腳本會遇到各種 IO 錯誤)與模組(重複使用程式碼)。
彌補了什麼缺陷#
彌補了 ABC「無例外處理、無模組、不可擴充」三大缺陷;彌補了 shell「無資料結構、無抽象能力」的缺陷。
程式範例#
0.9.0 就已完備的三大骨架:
# 例外處理(參考 Modula-3/CLU):取代回傳碼檢查
try:
f = open("/etc/passwd")
data = f.read()
except IOError as e: # 錯誤有統一的處理點,不會被遺漏
print("讀檔失敗:", e)
finally:
f.close()
# 類別(參考 Smalltalk):一切皆物件
class Point:
def __init__(self, x, y):
self.x, self.y = x, y
def distance(self): # 方法本身就是物件
return (self.x**2 + self.y**2) ** 0.5
# 模組系統:從第一天就能寫大程式
import math, os # math.sqrt、os.path 都可重複使用
shell 時代的錯誤處理(對比):
# 回傳碼容易遺漏:忘了檢查 $?
cat /etc/passwd > /dev/null || echo "失敗"