Python のクロージャとレキシカル変数を使ったシングルトンっぽいもの
実際にはシングルトンではなくて、共有インスタンスを返すメソッドを実装する、ってだけなんだけど。
class A(object):
@staticmethod
def shared():
instance = A()
A.shared = staticmethod(lambda: instance)
return instance
- 共有インスタンスとなるオブジェクトを生成し、レキシカル変数にバインドする
- このオブジェクトを返す無名関数で、元の関数 shared を置き換える
何が嬉しいかというと、共有インスタンスを参照するための変数(今回の場合は instance)を関数外から不可視にできること。変数のスコープが必要以上に広いと不安になります。実行時に遅延インスタンス化されるのが嫌なら、クラス定義の直後に一度呼び出すなりすればいいと思う。
gist:290628 に doctest とか追加したものを置いてあります。
Google AppEngine で Django 1.1 を使う
Google AppEngine の SDK および実行環境には、Web アプリケーション・フレームワークの Django がプリインストールされている。
しかし、デフォルトで有効になっているのは 0.96 という相当古いバージョンだ(もっとも、Google AppEngine リリース時点では、これが最新のバージョンであった)。すでにサポートも終了しており、バグや脆弱性の修正もされないため、できれば最新の 1.0/1.1系列を使いたい、という人が大半だろう。
しかし、これまで、バージョン 1.0 以降の Django を Google AppEngine で使うのは骨の折れる作業だった。