pickleマジ便利 あとipythonの初期化ファイルにいろいろ記述して便利に

[twitter:@clavicle]が便利だと言っていたので、ふと思い出して使ってみた。

import pickle
dic = {"a":3}
pickle.dump(dic,open("hoge.dump","w")) #オブジェクトをシリアライズして保存
dic2 = pickle.load(open("hoge.dump")) #オブジェクトをデシリアライズしてロード
print dic2 # {"a":3}として元のオブジェクトの状態が再現される

詳細: 3.14.4 何を pickle 化したり unpickle 化できるのか?

以下の型は pickle 化できます:
None、 True、および False
整数、長整数、浮動小数点数複素数
通常文字列および Unicode 文字列
pickle 化可能なオブジェクトからなるタプル、リスト、集合および辞書
モジュールのトップレベルで定義されている関数
モジュールのトップレベルで定義されている組込み関数
モジュールのトップレベルで定義されているクラス
__dict__ または __setstate__() を pickle 化できる上記クラスのインスタンス

普通のオブジェクトなら大丈夫だそうです。

iPythonの初期化ファイルをいじって使いやすく

IPython - Numerical Analysis with Python

iPython便利すぎて、僕はだいたいzshとiPythonの中で生活してるんですが、よく使うものなので関数を追加して便利にしておきたい。
で、今挙げたPickleを適当にラップして簡単に呼び出せるようにしておきます。(既に十分簡単なんですけどね...)

~/.ipython/ipythonrcに次の記述を追加

..
execfile ~/.pyrc

これでiPython起動時に ~/.pyrcが評価されるようになります

うちの ~/.pyrc はこんな感じ
一部 seeモジュール や PyObjC(AppKit) に依存してます

# -*- encoding:utf-8 -*- 
import os,sys,re
from see import see 
import pdb
import pickle
from AppKit import NSSound
import subprocess

q=quit

def psave(fname,obj):
    pickle.dump(obj,open(fname,"w"))

def pload(fname):
    return pickle.load(open(fname))

def playsound(fname):
    sound = NSSound.alloc()
    sound.initWithContentsOfFile_byReference_(fname, True)
    sound.play()
    while True:
        if not sound.isPlaying():break

def getClipboard():
    p = subprocess.Popen(['pbpaste'], stdout=subprocess.PIPE)
    retcode = p.wait()
    data = p.stdout.read()
    return data

def setClipboard(data):
    p = subprocess.Popen(['pbcopy'], stdin=subprocess.PIPE)
    p.stdin.write(data)
    p.stdin.close()
    retcode = p.wait()

よく使うものほど短い名前でホゲホゲ
今思ったんだけど .pycにしてしたほうiPython起動時のオーバーヘッド減るかも。