タグ

ブックマーク / inforno.net (7)

  • inforno :: Python:re.ScannerでS式パーサ

    Rubyの StringScanner は個人的にかなり好きなモジュールで、Rubyでちょっとしたパーサなどを書くときに重宝しています。 一方、Pythonにはexperimentalながら re.Scanner というクラスがあります( >= 2.4 )。experimentalなのでマニュアルにはのっていませんが。この re.Scanner はかなりシンプルなんですが典型的な StringScanner の使い方の範疇では、こちらのほうがキレイに書けるような気がします。 re.Scanner の使い方 使い方は非常に簡単で (regex, action) のリストを渡してScannerオブジェクトを作成 action は(scanner, string_matched) => stringな関数、Noneを返せば結果は無視される。 scanメソッドでスキャン。結果が配列で返ってくる と

    kzfm
    kzfm 2010/11/21
    pythonだとre.Scannerってのがあるのか
  • inforno :: Python,Rubyの言語内DSL構築力:PythonでRakeをまねる場合を例に

    Python で Rake を真似るとしたら という反応を頂いたので、それにまつわるお話を。 まず、CodeReposにコミットしてあるtasktoolsは distutils及びsetuptoolsを拡張する ということを念頭に置いています。ですのである程度distutils.core.Commandの思想というか、インターフェイスを残しています。 タスクをクラスで定義すること オプションの定義方法 sub_commands や finalize_options といったメソッド などなどは元のまんまです。 じゃあ、 distutils や setuptools を抜いて好きにRakeをPythonで真似るとしたら、というのが今回メインのお話。最初にこんな感じでコマンドを定義しますよ、というのを出してしまいます。 1from __future__ import with_statemen

    kzfm
    kzfm 2010/09/16
    言語内DSL
  • inforno :: Python: パターンマッチしてみる

    なんか、趣味では最近はC言語ばっかりだったりするわけですが。 さて、関数型言語系をカジった人なら誰しも取り付かれる、モノ、それがパターンマッチ。パターンマッチが使えると、とにかく直感的にコードをかけますよね。 つーわけで、Pythonでパターンマッチを実装してみました。機能的には リスト,タプルに対するパターンマッチ パターン変数への束縛 ガード条件 任意のオブジェクトに対するパターンマッチ 部分パターンの束縛(Ocamlのas) あたりを実装してみました。これだけあれば、かなり便利にコードをかけます。できるだけ、手軽に書けるように工夫してみました。こんな感じです。 変数束縛とガード。 getattr でごにょごにょしてるので簡単にかけます。 1m = Match([1,2,3]) 2if m.when([1,2,m.var]) and m.var > 2: 3 print m.var 4

    kzfm
    kzfm 2009/12/25
  • inforno :: Python版Rake「tasktools」をCodeReposにコミットした

    以前紹介したPython版Rakeもどき を改良してCodeReposに突っ込みました。まだ100行くらいです。自分では一番使っている自作モジュールなのでそろそろまとめようと思っていたのです。 http://coderepos.org/share/browser/lang/python/tasktools/trunk/tasktools.py 改良点 setuptools があるときはそっちを使うようにした。 use_without_standard メソッドによって distutils 標準タスクを消すことができる。これによって --help-commands の画面がすっきりする。また、この場合名前空間のセパレータに : を用いるようになった。 global_description によってタスクファイル自体に説明がつけられるようになった。 load_path メソッドで指定したディレ

    kzfm
    kzfm 2008/03/16
  • inforno :: Python標準モジュールでRakeもどき

    誰もが一度使うと便利さと気軽さに感動するRubyが誇るライブラリ、 Rake 。 プログラムのビルドもそうなんですが、雑多なタスクを簡単に書けて、整理できるのがなんといっても魅力的。RailsなんかではDBの作成から何から、ばんばんRakeタスクにされていますよね。 さて、俺はPythonistasなので、PythonでRakeみたいなのがほしいわけです。ビルドに限っていえばPythonは Scons という素晴らしいツールがあります。C言語はおろか、JAVAPDF、PostScriptなどなど、さらにはSubversionもサポートしていますし、並列コンパイルもでき、実績も多数で申し分ありません。 でも俺がしたいのは、雑多なタスクを放り込む、コレ。そういうのを簡単にやるライブラリってPythonではないんでしょうか。RubyではRakeが標準添付されるというのに。いえ、あります。前から

    kzfm
    kzfm 2008/02/09
  • inforno :: Python:アクセサの生成

    Pythonの練習がてら、アクセサの生成をやってみる。どうせ探したらいっぱいコードが転がってるだろうし、練習にはうってつけかな、と。 まず、ダメそうだけど、Rubyをやってる人からするとこうかきたい、というコード。 1class Test(Accessor): 2 attr_accessor("__test", "__test2", "test3", "_test4") 3 4 def __init__(self): 5 self.__test = "test_value" 6 self.__test2 = "test2_value" 7 self.test3 = "test3_value" 8 self._test4 = "test4_value" こんな感じ。まぁ、絶対にダメそうだ(笑 でも組み込みとはいえ、classmethodやstaticmethodみたいなのもあるから無理やりに

    kzfm
    kzfm 2007/11/20
    アクセサ
  • inforno :: Python:お手軽にPluggableにする

    Pythonで自分用の小物アプリを結構書き溜めてるんですけど、実はそのほとんどにプラグインシステムみたいなのをつくってたりします。 たとえばファイルの整理自動化みたいなの。ファイルの移動前に処理を追加する、てな部分をプラグインにしてあるわけです。 まぁ機能的にはCPANのClass::Componentっぽいもんですね。ですがそこまで高機能なのはいらないので、シンプルに自分が必要な部分だけまとめてみました。 1from inspect import getmembers, ismethod 2import types 3 4class Pluggable(object): 5 def __init__(self): 6 self.hooks = {} 7 8 def load(self, *config): 9 self.load_config(*config) 10 self.load_

    kzfm
    kzfm 2007/11/08
    pythonでプラグインシステム
  • 1