Pythonクラスをシリアル化する方法|pickleモジュールの使い方を解説
オブジェクトのシリアル化とは?
オブジェクトのシリアル化(直列化)とデシリアル化(復元)は、ある程度規模のあるPythonプログラムなら必ず登場する日常的な処理です。データをファイルに保存する、設定ファイルを読み込む、HTTPリクエストに応答する——こうした操作にはすべて、オブジェクトのシリアル化とデシリアル化が関わっています。
シリアル化には、さまざまなスキーム(方式)、フォーマット、プロトコルが存在し、これらを使ってPythonオブジェクトをストリームとして書き出し、後から元の状態のまま復元します。そして重要なのは、どの方式・フォーマット・プロトコルを選ぶかによって、プログラムの実行速度やセキュリティが大きく左右されるという点です。
pickleモジュールでオブジェクトをシリアル化する
ここでは、複数のPythonオブジェクトを格納した辞書(dict)を例に、シリアル化の手順を見ていきましょう。なお、クラスもまたPythonオブジェクトの一種であるため、まったく同じ手法でシリアル化できます。
使用するのは、Python標準ライブラリのpickleモジュールと、そのメソッドpickle.dumps(object)です。
foo = dict(int_list=[3, 4, 5], text='Hello World', number=9.99, boolean=False, none=None) import cPickle as pickle print pickle.dumps(foo) print pickle.dumps(foo, protocol=pickle.HIGHEST_PROTOCOL)
コードのポイント
- pickle.dumps(foo):デフォルトのプロトコルでオブジェクトをバイト列に変換します。
- pickle.HIGHEST_PROTOCOL:利用可能な最も高いプロトコルを指定することで、より高速かつ効率的なシリアル化が可能になります。
Python 3での注意点
上記のコードはPython 2向けの記述です。Python 3では
import pickle foo = dict(int_list=[3, 4, 5], text='Hello World', number=9.99, boolean=False, none=None) print(pickle.dumps(foo)) print(pickle.dumps(foo, protocol=pickle.HIGHEST_PROTOCOL))
このように、pickleモジュールを使えば辞書やクラスインスタンスなど、ほぼすべてのPythonオブジェクトを簡単にシリアル化できます。用途に応じて適切なプロトコルを選択することが、パフォーマンスと安全性の両立につながります。
-
Pythonで名前空間を作成する方法をわかりやすく解説
Pythonでは、パッケージ、モジュール、クラス、関数、メソッドのそれぞれが独自の「名前空間(namespace)」を持っており、変数名はこの名前空間の中で解決されます。そして、関数やモジュール、パッケージが評価される(つまり実行が開始される)タイミングで、新しい名前空間が自動的に生成されます。そのため、名前空間を作成したい場合は、以下のいずれかの操作を行うだけで実現できます。関数を呼び出すオブジェクトをインスタンス化するモジュールをインポートするパッケージをインポートする例えば、「Namespace」というクラスを定義し、そのクラスのインスタンスを生成すれば、そのオブジェクト自体が一つの名前
-
PythonでEnvironmentError例外を捕捉する方法をわかりやすく解説
EnvironmentErrorとは何か EnvironmentErrorは、Pythonの外部から発生するエラー(オペレーティングシステムやファイルシステムなどに起因するもの)のための基底クラスです。StandardErrorクラスのサブクラスであり、同時にIOErrorおよびOSErrorという例外の基底クラスでもあります。 重要なポイントとして、EnvironmentError自体は直接発生(raise)されることはありません。実際にプログラム上で捕捉するのは、そのサブクラスであるIOErrorやOSErrorになります。 EnvironmentErrorの継承関係 Environme