Python
trac(0.12)のプラグインを書いてみました。以下のファイルをプロジェクトディレクトリにあるpluginsにおいたら設定無しに動きます。プラグインを普通のpythonファイルで書くときにしないといけないことは、revisionを書くことと、最低1つtrac.core.Component…
まずpropertyはclassのようです。なので継承して、次のようにgetterをはじめからproperty側で定めるようなことができます。 def test_extends_property(self): class getclassname_property(property): def __init__(self): property.__init__(self, self.ge…
前回のものにDFAを構成しながらマッチングするクラスを追加しました。 class State(object): def transfer(self, c, nlist): pass def appendTo(self, nlist): nlist.append(self) SuccessState = State() class CharState(State): def __init__(self, c): s…
lexerを書いていないので、全体で100行少しです。インプットとしては正規表現をpostfix形式に変換して入力する必要があります。'a|b'の場合'ab|'といった感じです。あとは文字列の接続に'.'を使ってます。なので'abc'は'ab.c.'、'ab*c'は'ab*.c.'となります…
厳密にHTMLの仕様に基づいて作っているわけではないですが、htmlっぽいタグとかをトークン化するものを書きました。open_tagの後にちゃんとclose_tagがあるかとか、そういった仕事はしません。それはParserなどがする仕事としてます。標準ライブラリのHTMLPa…
良い方法なのかは疑問ですが、__metaclass__を使って、メソッドの定義を強制することができます。 #!/usr/bin/env python2.6 import unittest import itertools import sys class EntryType(type): def __new__(cls, name, bases, d): interface = ('get_siz…
コンポジットオブジェクトが含むオブジェクト全てを走査して、等しいかどうか見れるような__eq__があったら、テストしやすいはずです。更に__repr__で文字列にして、どのようなオブジェクトが含まれるか確認できるともっと便利です。そのようなメソッドは実…
子クラスが独自に持つフィールドをtupleで指定すると、自動的にコンストラクタで指定できるフィールドに変化するパターンを紹介します。tupleで指定するというのは、このような感じのことです。 class Child(Parent): fields = ('child_field1', 'child_fiel…
継承の仕方に制限をつけたいときもあるかと思います。そんなときはtypeを継承して自分の好きなタイプを作って、__metaclass__で指定してみましょう。多重継承の他にも、メソッドに制限をつけることもできるでしょう。(以下の例では、継承数を1にしているので…
ぼくはreST記法をおぼえていません。だからSphinxもあまり使えません。挑戦はしましたが、毎回、コンパイルを通さないと見れないようです。こんなのC言語を知らずにC++でしかもSTLガンガンなコードを書くようなもんです。でもSphinxは使いたいと思っています…
これはjinja2の設計の紹介であり、壮大な"hello, world"の実装と見ることもできます。非常に簡略化したjinja2(=MY_jinja2)を使って、おおよその構造をソースコードで示したい(あまり日本語では説明できない)のですが、そのためにはせめてjinja2と同じように…
読み込み専用のフィールドをPythonを作るとき、propertyを使う方法があると思います。しかし単純にpropertyを使うだけだと、フィールドが変更することは不可能ではありません。 def test_property(self): class A(object): def __init__(self, i): self.i = …
python製のテンプレート・エンジンjinja2がどんな処理しているのか勉強してみました。メタクラス,ジェネレーターなどpythonらしい書き方をいくつかおぼえることができました。あと、exec関数の使い方。これは、pythonらしいのか不明ですが、jinja2で具体的な…
webサーバー/クライアントを実装するとき、server/clientが正しく連携するかテストしたいかと思います。しかし、serverとclientをシングルスレッドで同時に扱うことはできないので、単純にunittestを使っただけでは完全な自動テストを書くことはできません。…
前回までにStringIOと同じように動作するモジュールMY_StringIOを実装するところまで話が進みました。実装自体にストーリーを付けたり、意味のあるまとめ方をするのは難しいと思うので淡々と実装を進めることにします。MY_StringIOにはまだwriteすらありませ…
前回ファイルIOのテストは面倒だという話をしました。それでStringIOモジュールがfileobject(open(filepath)で生成される)をエミュレートしているので、StringIOを調べようということになったと思います。StringIOモジュールの動作を知るには、ソースコード…
StringIOを読んでいるとわざわざ文字列連結のためにself.buflistというリストを用意して、joinして文字列を連結させています。ところが、こんなのself.bufと+演算子だけでできてしまいます。考えられるのは、リストを生成して、joinする方が速いということで…
ファイルにアクセスして、色々と細かい操作をしないといけないことはあるかと思いますが、ぼくは正直ファイル操作処理がOS任せになってブラックボックスなところもあって馴染めません。さらにファイル操作した後、ファイルの内容が変更してしまっては、くり…
前回までにオブジェクトにメソッドを追加する以外のことはやったので、ここではメソッドを追加してあげましょう。テストはtestStringに書いてありました。コメントアウトされてる部分を元に戻します。 def testString(self): s = String.new('abc') self.ass…
前回はコンストラクタを定義しました。次はgetattrを定義して、フィールドにアクセスするところまで進めます。テストの方は、testStringを復活させます。 def testString(self): s = String.new('abc') self.assertEqual(3, s.length) # self.assertEqual('a…
C拡張モジュールの例として、helloworldをstringオブジェクトとして返すような簡単な例は見ますが、ユーザー定義オブジェクトをC言語で実装するような例は見つかりませんでした。Makefileはhelloworldモジュールを作るときと変わらないので省略します。最低…