<本記事は例によって、
「まずは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スクリプトを含めて、色々使ってみてく
ださい(ちなみに私は、イントラネット環境で掲示板や
情報ページとして活用しています)
/機械伯爵/