GAE/PyでLow Level API - Keyオブジェクトを触ってみる 2日め

本題とは関係ないけどKeyクラスにはto_path()という関数があって、バッククォート演算子よりもあっさりした文字列表現が得られるということをついさっき知りました。

バッククォート演算子

`key`
# datastore_types.Key.from_path(u'mykind', 1, _app=u'ishida-makot-py')


to_path()関数

key.to_path()
# [u'mykind', 1]


バッククォート演算子は「自身を表す文字列をpythonソースコードとして」返す演算子。クラス定義の「__repl__()」関数で実装されている。Python3ではなくなるみたい。
to_path()関数はKeyクラスに実装されている関数。カインド名と「IDか名前」でなるリストを返す。スッキリして見やすいのでこっちを使おう。

Keyのパス

Keyクラスはエンティティを一意に識別するための情報を「パス」っていうもので表現しているみたい。from_path()とto_path()の関数名にある「パス」「パス」っていうのはフォルダ階層みたいなツリー構造で要素の位置を示すために使う「/usr/local/bin」みたいな文字列だ。

['parentkind', 1, 'childkind', 1, 'grandchildkind', 1]

というリストになるので、これは

/親キー/子キー/孫(自分)キー

のようなイメージなのだ

データストアがエンティティを一意に識別するためのキー情報はツリー構造のパスみたいになってるんだな。

エンコードとデコード

Keyクラスは自分自身を文字列としてエンコードする機能を持っている。機能を持っているというか、、、__str__()関数がエンコードされた文字列を返すように実装されている。Keyの文字列表現はエンコードされた文字列なのだな。

デコードはクラスのコンストラクタで実装されてた。Keyクラスのコンストラクタにエンコードされた文字列を渡すと文字列がデコードされてKeyオブジェクトに復元される。

こんな感じ

    key = Key.from_path('mykind', 1)

    encoded = str(key)
    print encoded # agx0ZXN0YmVkLXRlc3RyEAsSBm15a2luZCIEbmFtZQw

    decoded = Key(encoded)
    print decoded.to_path() # ['mykind', 1]
 
    self.assertEqual(key, decoded)