Skip to main content

· 2 min read

在看 pycon-trac-presentation 時, 發現 Matt Good 用 docutils 模組提供的 "rst2s5" 套件來將結構文本 (rst) 轉換成網頁投影片 (s5) 效果還蠻不錯的。用他客製化的 rst2s5 模組可以透過 pygments 支援程式的語法高亮展示.

以下提供使用方法

下載

$ easy_install docutils $ easy_install docutils pygments

並下載 rst2s5 with code high lighting

用法

rst2s5.py [輸入].rst [輸出].html

i.e. rst2s5.py xxx.rst ooo.html

會產生的輸出結果是 "ooo.html" 這個檔名的檔案, 跟一個包含 s5 投影片 js/css 資料的資料夾.

語法備忘

=======
標題
=======

:Author: Fred Lin
:Date: $Date: 2007-03-16 $

一張投影片
==========

.. code-block:: pycon

>>> # python console

.. class:: handout

handout 是放註解的地方. 不會 show 到投影片上
code-block 可用 pygments 提供的各種語法高亮, 如 pycon, python, bash, html...

投影片再一張
============

.. class:: incremental

* 1st. item
* 2nd. item

.. image:: python.png

.. class:: handout

依序顯示重點. image 會嵌入圖片.

.. include:: pylevels.rst

語法參考
========

http://docutils.sourceforge.net/docs/user/slide-shows.html

.. class:: handout

前一張後的 include 語句支援嵌套其他 rst 文件.

· 4 min read

框架介紹

Python 社群中各種 web 框架開發路線都有.

Django 目前 Django 框架吸引的使用者最多,一方面原因是 Django 團隊的性質,Django 有一個像 Rails 那樣的專職團隊在維護,保證了專案的持續性。同時不錯的指引文件,對初學者友善的 Admin 介面,開發者 Adrian 四處不遺餘力的宣傳也是吸引人的原因. 除了持續框架維護的承諾,宣傳之外,Django 框架傑出的效能也屢屢在網頁框架評比中勝出. python 創造者 Guido 也將 Django 視為 Python 語言的首選網頁框架.

Django 網頁框架的每個部份都是 Django 開發團隊自行建置. 但是在 Django 之外,python 社群其實早已有各式各樣的網頁開發工具. TurboGears 與 pylons 開發者則是致力於將這些開發有年的網頁開發工具 "黏起來", 發揮小兵團結的綜合效應.

TurboGears 例如使用 TurboGears 框架,就可免去各模組間合作時的重複設定。由於各個挑選的模組都經過多年實戰測試,除了滿足基本的開發需求外。也比較容易達成較深入或較特殊的需求.

構成 TurboGears 框架的組件,包含 Template, model, URL dispatcher, AJAX library 等等全部可以透過 setuptools 工具簡單安裝與替換。彈性 100%!

TurboGears 框架還提供命令列 (tg-admin) 和網頁工具箱 (Toolbox) 等可供擴展的輔助工具,從而獲得相當棒的開發體驗. (Toolbox 裡面也有類似 Django Admin 的 Catwalk 工具.)

整合 Django 與 TurboGears? 那麼這兩個都很棒的框架有沒有整合的可能呢?

Kevin Dangoor (TurboGears 框架創造者) 在 Pycon 2007 的 web panel 說:

You can have more innovation with individual components with their own maintainers than with a full stack. 比起完整的框架,將各個組件讓各自的維護者維護可以產生更多的創造性

TurboGears 框架的這種開發哲學與 Django 團隊走的路是完全相反的。加上 Django 團隊堅持在他們的網頁框架中不包含 AJAX 功能並不成問題 (我覺得問題是在其他 Django 用戶沒有什麼很容易的方法提供 Django AJAX 擴充包). 在這種理念完全不同的情況下是不可能整合的.

Pylons TurboGears 跟 Pylons 兩個框架走的路線更相近。一些擴充模組或樣板引擎早都可以共用了. pylons 差不多就是換掉 controller 核心的 TurboGears. Pylons 框架沒有 TG 的 toolbox 或 Django 的 Admin 介面,但支援 WSGI, web helpers (學習 Rails), 效能也不錯,卻還沒找到自己的最佳定位.

整合 TurboGears 與 Pylons?

那麼這兩個框架有沒有整合的可能呢?

it’s the style/feel thing that represents the difference between the two framework -- Kavin Dangoor

Kavin Dangoor Mark Ramn 兩位 TurboGears 框架的代表人物在 pycon 2007 後紛紛對 TurboGears 與 Pylons 的整合發表了樂觀的文章。原因是兩個框架的理念相近,差別主要在預設選擇的套件不同。還有實作上所造成的差異.

· 7 min read

楔子

自從聽說了敏捷方法 (Agile programming) 後,一直很想試試這種 "測試先行" 的開發方式. 但是在 python 上前後試過 unitest, doctest, 都不夠 "簡單到會想常常拿來用" 的程度,

今天拿了一份原型寫得差不多的程式,試著寫些測試例子 (test case) 後用 nose 測試工具來測試看看,想不到 nose 還蠻容易使用的.

三步驟使用 nose 開始測試

  1. 安裝或更新 nose

# easy_install -U nose

沒用過 easy_install ? 你該開始試著用了!

  1. 撰寫測試例子 (test case)

打開一個新的資料夾,我們統一在這個新資料夾裡寫主程式與測試例子

將要測試的內容寫入 something.py 這個檔案[註 1]:

> class Hello(object):
> def __init__(self):
> self.template = "hello world"
>
> def render(self):
> return self.template

nose 測試工具識別測試例子的條件,是判斷找到的這個類別或方法的名稱是不是以 "test" 或 "Test" 開頭。如果是的話就當成是測試例子. nose 會自動搜尋子目錄下所有符合的測試例子,並自動開始測試.

因此我們第一個範例程式用的測試例子只要是函式名稱用 'test' 開頭來命名就可以囉,我們命名一個檔案 testsomething.py (這個檔案名稱以 test 開頭與識別測試例子的條件並無關聯,只是慣例上放測試的例子的檔名都會加上 test 字樣), 並在裡面寫下:

testsomething.py:

>
> def test_Hello():
> abc = Hello()
> assert "hello" in abc.render()
>
> def test_foreign():
> abc = Hello()
> assert "bonjour" not in abc.render()

assert 是 nose 用來判斷測試結果的語法。主要有這兩種:

  • assert 片段 in "結果"

  • assert 片段 not in "結果" 對照上面範例,可以得知上面兩者的意思就是:

  • 測試結果 "hello" 字串應該在 abc.render () 回應的結果裡

  • 測試結果 "bonjour" 字串應該不會在 abc.render () 回應的結果裡如果上面任一種情況不符合 assert 敘述,這個測試用例就會回報失敗.

  1. 開始測試

切換到檔案在的檔案目錄下,輸入

# nosetests

結果應該類似這個樣子:

> D:\path\pyfile>nosetests
> ......
> ----------------------------------------------------------------------
> Ran 1 tests in 0.020s
>

OK 那麼如果我們改動了 something.py 中 self.template 變數的內容,在內容裡加上了 "bonjour" 字樣,會發生什麼事情呢?

有測試工具的好處就是我們只要單純地再次運行 nosetests 命令就好了,不用花腦力去判斷或思考:) 我們查看訊息時會看到類似以下的訊息:

> 2, in runTest
> self.testFunc()
> File "D:\path\pyfile\testsomething.py", line 90, in test_Hello
> assert "bonjour" not in abc.render()
> AssertionError
> -----------------
> Ran 1 tests in 0.030s
>
> FAILED (failures=1, errors=1)
>

上面的報告提醒我們有一件錯誤: "bonjour" 字串原本不應該出現在 abc.render () 回應結果中的,但結果中竟然出現了!

所以如果我們的測試用例寫的好,就可以肯定我們剛剛改動 something.py 時出了些問題。測試這件事確實有效!

較好的約定

我們已經知道,只要類別或方法的名稱是以 "test" 或 "Test" 開頭。就會被 nose 當成是測試例子,所以其實在一個小程式中,我們大可把測試例子跟主程式放在同一個檔案裡.

但是當你都還不很確定你在幹什麼的時候,我建議還是將測試例子跟主程式分開。這麼做除了程式不容易搞混之外,在切換檔案時,還可以順便切換撰寫程式與撰寫測試例子時的不同 MindSet.

測試驅動

那麼如果我們想改寫 hello 函式,好讓它可以用法語 "bonjour" 打招呼,我們該怎麼辦? 記得 "測試先行", 考慮加上一個新的測試例子,而不影響原本的功能吧!

加入的測試例子:

>
> def test_bonjour():
> abc = Hello('bonjour')
> assert "bonjour" in abc.render()

接著要做的就是再跑一次 nosetests, 看到這個新的例子跟我們報告錯誤了. OK, 那就開始修改 hello 函式吧![註 2]

其他的測試

nose 支援的測試的方式琳瑯滿目,可以使用 "nosetests -h" 命令來查看支援的項目.

例如另外一個常用的測試方式是使用 doctest: nosetests --with-doctest

那麼 doctest 是什麼樣的測試方式? 又該怎麼使用 doctest 呢?嘿嘿,4 月 OSDC.tw 07 再開講囉:D

我知道這個工具已經快半年了,到今天才有時間,勇氣真的下去嘗試. 讓我白白錯過這樣好用的工具這麼久,應該怪在 nose 太少文件可以參考的頭上吧? 乾脆自己來寫個 "三步驟使用 nose 開始測試" 的簡易文件好了.

註 1: 這篇文章不講怎麼寫 python 程式,這部份請自理:P 註 2: 同註 1, 建議妳逛逛 www.python.org.tw 可以看到更多參考資料

· 3 min read

任何安裝好的 python 版本中都包含著 python 禪學 (哲學), 在任何 python 互動介面 (如 IDLE) 中輸入

import this

則會出現如下的 python 禪學 (哲學)

Python 禪學 (pythoon Zen)

美觀的比醜陋的好 (Beautiful is better than ugly) 直率的比含糊的好 (Explicit is better than implicit) 簡單的比繁雜的好 (Simple is better than complex) 繁雜的比晦澀的好 (Complex is better than complicated) 平直的比巢雜的好 (Flat is better than nested) 疏落有致的比櫛次鱗比的好 (Sparse is better than dense) 可讀性應當被重視 (Readability counts)

就算是特例,也不能壞了規矩 (Special cases aren't special enough to break the rules) 然而能解決問題仍然比維持單純重要 (Although practicality beats purity)

錯誤不應該被默默地放過 (Errors should never pass silently) 除非你是刻意為之 (Unless explicitly silenced)

面對模稜兩可的情況,要抗拒猜測的誘惑 (In the face of ambiguity, refuse the temptation to guess) 應該會有一個 -- 而且最好只有一個 -- 適當的方式來實現 (There should be one-- and preferably only one --obvious way to do it) 雖然不是這個語言創造者的妳一開始可能看不出來 (Although that way may not be obvious at first unless you're Dutch)

現在動手比總是不動手的好 (Now is better than never) 然而不動手可能還比沒有準備就動手的好 (Although never is often better than right now)

如果實作方式難以解釋,那大概是個壞主意 (If the implementation is hard to explain, it's a bad idea) 如果實作方式易於解釋,那可能是個好主意 (If the implementation is easy to explain, it may be a good idea) 名稱空間是一個很棒的主意 -- 我們就盡量用吧!(Namespaces are one honking great idea -- let's do more of those!)

--Tim Peters (gasolin 翻譯)

2007/03/01 更新: 參考 http://wiki.python.org.tw/The_Zen_Of_Python 其他人的理解修改

· 2 min read

前幾個禮拜看到 limodou 的 Openbook platform 後弄的 TurboGears 製作書站 screencast (示範影片)

第一個影片裡示範了如何使用 TurboGears 建立一個專案,與如何啟動開發用網頁伺服器. 並展示了如何透過修改模板快速訂製頁面。這個 screencast 中完全使用 TurboGears 預設的 CSS style.

1st. is a quickstart demo with hello world template version (6.5MB)

第二個影片裡示範了如何使用 TurboGears 工具箱 (Toolbox) 中的模型設計工具 (Model Designer)和資料編輯工具 (Catwalk) 來建置 TurboGears 動態內容網站

2nd is Model Designer with Catwalk (7.7MB)

第三個影片中使用到我寫的 TurboGears tgcrud 擴充模組,透過 tgcrud 擴充模組可以很容易地產生類似 Rails 的 scaffold 介面架構。但與 scaffold 不同的是所有 code 都是 implicit 的,更加容易修改.

3rd. is tgcrud, the TG's scaffold (5.2 MB)

感謝 Elvelind Grandin 協助上傳至 TurboGears 網頁空間.