作者: 機械伯爵
日時: 2005/5/14(12:50)
<本記事は例によって、
「まずはPythonではじめよう'05」ML
とマルチポストです。>

 Zope は Python で実装された、Web アプリケーション
サーバです。たぶん Python 自体の知名度より、(少なく
とも日本では)Zope の知名度のほうが遥かに高いと思わ
れます。そのため、時には Python が"Zope のスクリプ
ト言語"と紹介されることも少なくありません。

 しかし、Zope の紹介サイトや Python の入門サイトが
多くある中、なぜか Zope での Python の書き方を扱っ
た入門サイトというのは全く見当たりませんでした(Zope
関連の書籍は沢山あるので、そちらについては全ては調
べていませんが)これはもしかすると、Zope で Python
スクリプトを使うのは、ある程度の経験者に限られると
考えられているのかもしれません。

 とはいえ、Python 言語の入門用にこそ向きませんが、
Python のそこそこの知識さえあれば Zope でさまざまな
面白いことを行えると私は思います。

 そこで、「これだけ知っていれば、なんとなく Python
スクリプトオブジェクトは作れる」程度の注意点を、さ
らっと紹介してみようと思います。

 なお、Zope そのものの説明や運用については、日本
Zope ユーザ会のサイト (http://zope.jp/) などを参照
して下さい。また、説明に使用する Zope のバージョン
は 2.7.6 です (Python2.3.5 で動いています)



1.スクリプトオブジェクトは「関数」扱いであり、引数
 は parameter というテキストボックスで指定する。ま
 た、最後(あるいは途中)に return 文を加え、返り
 値を明示する。

 一番気になるのはこれでしょうか。

 関数名はオブジェクト名であり、パラメータは
parameter ボックスに指定します(このボックスの中の
書き方は、カッコが無いだけで、普通の Python スクリ
プトの引数の書き方と同じです)

 return 文は無くても動くようですが、いちおう"return
None"あるいは"return"と書いておくほうが無難でしょう。

 関数形式ということさえ押さえておけば、その中で関
数でもクラスでも定義して返せますので、アイディア次
第では様々に使えます。

例)関数を返すオブジェクト(呼び出し方の詳細については後述)

<Pythonスクリプトオブジェクト'maketasu'>
def tasu(a, b):
  return a + b

return tasu

<呼び出し方>
func = context.maketasu()
print func(123, 543)
return printed


2.同じフォルダ内のスクリプトを参照するときは、スク
 リプトオブジェクト名に"context."をつける。たとえ
 ば"blackknight"というスクリプトオブジェクトを呼び
 出すには、"context.blackknight"とする。

 context は「呼び出し元」ということですが、実際に
はスクリプトの入っているフォルダオブジェクトを差し
ます。

 ちなみに、同じフォルダに'ni'というフォルダがあり、
その下位の'knight'というスクリプトオブジェクトがあ
るばあいは、"ni.knight"でアクセスできます。

 context のほかにもバインディングされている変数と
して container というのがありますが、どこがどう違う
のか、今のところ私にはわかりません(色々テストした
けど結果は同じだし・・・)

例)下位フォルダのスクリプトの呼び出し

<niフォルダのknight>
return context.propertyIds()

<niの上位フォルダのblackknight>
print ni.knight()
return printed



3.スクリプト内では、アンダースコアから始まる名前は
 完全に予約されており、自由に定義できない。

 つまり演算子のオーバーロードに使うメソッドフック
などはおろか、クラスの初期化のための __init__ メソ
ッドすら定義できません。クラスを使う場合は、まず引
数無しでオブジェクトを生成し、そののちにメソッドで
必要なパラメータを引き渡します。

<makeclassスクリプトオブジェクト>
class X:
  def init(self, a, b):
    self.a = a
    self.b = b
    return self

return X

<呼び出し先>
X = makeclass()
x = X().init(123, 543)



4.print 文を使用した場合、"return printed"と最後に
 書くことにより、出力結果が画面で得られる。

 今までの例で適当に使っていましたが、この定型句で
出力を画面に表示できます。



5.インポートできるモジュールが制限されている。また、
 自分が作ったモジュールを使えるようにするには、外
 部メソッドの定義が必要。

 基本的にインポートできるモジュールは以下の通りで
す。

Product.PythonScripts.standard
AccessControl
string
random
math

 外部メソッドの定義については、面倒なので今回は割
愛します。



6.変数などを保存/受け渡し/変更する場合は、フォル
 ダの propertie を使用し、アクセスには context.
 propertie 名とする。

 フォルダのプロパティを操作する主なメソッドは以下の通り。


・プロパティの変更
 manage_changeProperties(REQUEST=None, **kw)
 キーワード引数を用いてプロパティを変更します。実
際にフォルダのプロパティーを変更するには、以下のよ
うに書きます。(REQUESTは特に指定しなくてかまいません)

使い方)
context.manage_changeProperties(spam="egg")
 なお、スクリプト自体には、永続的な変数は保存できません。


・プロパティの参照
 getPropery(id, d=None)
 プロパティの値を参照します。idは文字列で渡します。

使い方)
x = context.getProperty('spam')


・プロパティの作成
 manage_addProperty(id, value, type, REQUEST=None)
 スクリプト上でプロパティを作る際に使用します。基
本的にブラウザ上でも作れるので、あまり使うことは無
いとは思いますが・・・

 なお、タイプは以下の通り

boolean
date(日付)
float
int
lines
long
string
text
tokens(ホワイトスペースで区切った文字)
selection
multiple selection

使い方)
context.manage_addProperty('spam','ni ni ni','token')


・プロパティの削除
 manage_delProperties(ids=None, REQUEST=None)
 プロパティを削除します。ids には、削除するプロパ
ティのIDを含んだシーケンス(タプル、リスト)などを
指定します。

使い方)
context.manage_delProperties(('spam','egg'))

 プロパティに関するメソッドはまだまだありますが、
とりあえずこの程度知っておけば、そこそこのことは出
来ると思います。

 Zopeは、使い始めてみると非常に手軽で面白い環境で
すので、Pythonスクリプトを含めて、色々使ってみてく
ださい(ちなみに私は、イントラネット環境で掲示板や
情報ページとして活用しています)

 /機械伯爵/