fat runnerのいろいろな記録と挑戦

体重100kg超のオッサンですが、フルマラソン完走を目指すことになりました。応援よろしくお願いします。

python

Windows7上でのGAE for Python開発環境整備について

先週、数年越しの面倒な仕事が終わったので、今週から新しい仕事を本格的に開始する。

内容は、Google App Engineを使っての開発業務になりそう。

さて、昨日、そのための環境を作っていたんだけれど、結構ハマる所があったので、メモ。

いろんなウェブ上のドキュメントを見るかぎり、Pythonでの開発には、
Python2.5
AppEngineSDK/Python
が必須。 
でも、python2.5にはSSLモジュールが含まれていないから、これは別途コンパイルしなくちゃいけない。
SSLなしで使おうとすると、

WARNING:root:No ssl package found. urlfetch will not be able to validate SSL certificates

なんて、怒られてしまう。
で、SSLモジュールをコンパイルするにはVC2003かMingW32が必要で、もし、ここで全部オープンソースでやるんだったら、MingW(かCygwin)を使う必要がある。
で、SSLのパッケージをダウンロードしてコンパイルしてみる。

>python setup.py build -c mingw32

エラーを吐いて止まってしまう。python2.5に含まれるversion.pyが例外を吐いているみたいだ。事情はよくわからないんだけれど、該当部分のpythonのソースをみてみると、なんだか、gccのバージョンをチェックしてるみたい。たぶん、この部分をコメントアウトして強制的に例外を吐かないようにさせても、問題ないだろう。でも、バージョンチェックをコメントアウトするなんて、あんまり美しくない解決策だ。ちょっと考えてみる。
Cygwinのバージョン表記のルールが変わってしまったのが問題のようだ。(つか、最新のCygwinではpython2.5なんて昔のバージョンはサポートされてないってことかもしれない)
考えた末、バージョンチェックの正規表現を少し変更。
version.pyの100行目を

version_re = re.compile(r'^(\d+) \. (\d+) (\. (\d+))? (\. (\d+))?$',
                            re.VERBOSE)

に変更してみる。 
バージョンの問題はとりあえず、落ち着いたけれど、今度は、GCCの実行権限がないとエラーを吐く。
cygwinのgcc.exeをみてみると、
これ、symlinkになってるのね。リンク先はgcc4.exeか。
要するに、gcc4とgcc3を共存させるための措置なんだろうけれど、このsymlinkをウィンドウズ側が認識できなくてトラブルになるようだ。
とりあえず、gcc.exeをgcc4.exeのコピーで置き換えて乗り切ることにする。
コンパイル成功。
あとは、

> python setup.py install

でおしまい。 
で、そのあとで気がついたんだけれど、
このコンパイル済のSSLパッケージをWinインストーラで配布してくれているひとがいらっしゃった。
先に見つけられたら面倒な事考えなくて住んだのになぁ。

まあ、とりあえず、問題は解決。

あと、Kay frameworkをインストールしたよ。 

super(class, instance)?

python25のsuper()、先日から色々調べていました。
super(class, instance)という書き方をするんですが、このインターフェイスは、他の言語ではあまり見かけない冗長な書き方だなぁ、と。

いろいろ考えてみたんだけれど、super()は、現在のインスタンスにバインドされた上位クラスを返すわけだから、これを関数として実装するならば、現在のクラスとインスタンスが引数として必要ってことなのかな。

ところで、この件で公式のドキュメントをみて、いろいろ悩んでいたのですが、このライブラリレファレンスの記載が間違っているんじゃないかなぁ。
python2.5の日本語ドキュメントのライブラリレファレンスの組み込み関数のsuperのところで、

返された上位クラスオブジェクトが非バ インドの場合、二つめの引数は省略されます。

とあるんだけれど、
この部分の英文の原文では

 If the second argument is omitted the super object returned is unbound.

となっている。

正しくは、

2つめの引数が省略された場合、返される上位クラスオブジェクトは非バインドとなります。

なんじゃないかな。
どうなんだろう?


エキスパートPythonプログラミング


いま、エキスパートpythonプログラミングという本を読んでいます。 初心者向きではないですが、いい本です。 Pythonってのは、lispに近いんだな、というのを、感じさせてくれます。

pythonのstaticmethodとclassmethod

次の仕事で、google app engineでpythonのプログラムを書くので、pythonを勉強中。
というわけで、GAEのライブラリを見ていたんだけれど、クラスメソッドの挙動に疑問が出て、調査。

pythonのclassmethodって、Javaとかのstaticメソッドと同じようなものじゃないの?
Python のクラスメソッド – デコレータ @classmethod, @staticmethod を使って

調べてみると、ちょっと違うみたい。Javaとかのstaticメソッドに似た使い方のできるメソッドは、staticmethodというのがあって、classmethodというのは、それとは違う、らしい。
どうちがうのか、よくわからない。

更に検索してみる。
[Python]staticmethodはmethodではなかった

staticmethodとclassmethodの違いでC++的な静的メソッドを考える

以下、理解したことをまとめてみる。
間違っていたら、ご指摘ください。
まず、議論の前提
pythonの関数的なもの、Callableなものには、メソッドと関数の二種類がある。この違いは、メソッドは、なんらかのオブジェクトと結び付けられた関数であり、そのオブジェクトが存在しないと呼び出せないのに対して、関数の場合、 そういった、呼び出すときに、そういった「結び付けられたオブジェクト」を必要としないということ。
で、「結び付けられたオブジェクト」 が存在しない場合(たとえば、結び付けられたオブジェクトが、通常のインスタンスであれば、そのインスタンスがまだ生成されていない)、そのメソッドは、unboundと呼ばれる(つまり、unboundなメソッドは呼び出せない)。そうでない、結び付けられたオブジェクトが既に存在している場合はメソッドは、boundと呼ばれる。

つぎに、本題。
クラスメソッド(classmethod)は、その「結び付けられたオブジェクト」 がインスタンスでなくて、クラスであるようなメソッドである。クラスは、インスタンスと違ってクラス定義が読み込まれた瞬間から存在しているから、クラスメソッドは、常にboundである。
それに対して、静的メソッド(staticmethod)は、関数である。つまり、クラスに対する参照を持たない、ただ単に、クラスの名前空間の中に存在しているだけである。

つまり、staticmethodってのは、Javaのstaticとかに近くて、classmethodは、Rubyのクラスメソッドとかに近いということか?

たぶん、違いは、継承したときとかに出てくるんだろうけれども、正直、どっちか片方だけでも十分だったような気がする。クラスメソッドでは面倒だけれど、静的メソッドだと簡単に書けるとか(あるいは、その逆)いうようなプログラムってあるんだろうか? 
記事検索
タグクラウド
アクセスカウンター
  • 累計:

人気ブログランキングへ
  • ライブドアブログ