Python
 Computer >> コンピューター >  >> プログラミング >> Python

内部Pythonオブジェクトのシリアル化(マーシャル)


Pythonの標準ライブラリのmarshalモジュールはオブジェクトのシリアル化機能(pickleモジュールと同様)を提供しますが、汎用データの永続化やソケットなどを介したPythonオブジェクトの送信にはあまり役立ちません。このモジュールは主にPython自体が読み取り/をサポートするために使用します。コンパイルされたバージョンのPythonモジュール(.pycファイル)に対する書き込み操作。マーシャルモジュールで使用されるデータ形式は、Pythonバージョン間で互換性がありません(サブバージョンでさえも互換性がありません)。そのため、あるバージョンのコンパイル済みPythonスクリプト(.pycファイル)は、おそらく別のバージョンでは実行されません。したがって、マーシャルモジュールは、Pythonの内部オブジェクトのシリアル化に使用されます。

pickleモジュールと同様に、marshalモジュールは、マーシャリングされたオブジェクトを/からファイルに読み書きするためのload()およびdump()関数も定義しました。また、loads()およびdumps()関数は、マーシャリングされたオブジェクトの文字列表現を処理します。

dumps() −Pythonオブジェクトをマーシャリングするオブジェクトのようなバイトを返します。マーシャリングでは、標準データ型のオブジェクトのみがサポートされています。サポートされていないタイプはValueError例外を発生させます。

load() −この関数は、バイトのようなオブジェクトを対応するPythonオブジェクトに変換します。変換の結果が有効なPythonオブジェクトにならない場合は、ValueErrorまたはTypeErrorが発生する可能性があります。

次のコードは、dumps()を使用してマーシャリングされたPythonディクショナリオブジェクトを示しています。バイト表現は、loads()関数によってディクショナリに変換されます。

import marshal
person = {"name":"xyz", "age":22, "marks":[45,56,78]}
data = marshal.dumps(person)
obj = marshal.loads(data)
print (obj)

dump() −この関数は、サポートされているPythonオブジェクトのバイト表現をファイルに書き込みます。ファイル自体は書き込み権限のあるバイナリファイルです

load() −この関数は、バイナリファイルからバイトデータを読み取り、Pythonオブジェクトに変換します。

上記のように、マーシャルモジュールは.pycファイルを処理するために使用されます。次の例は、dump()関数とload()関数を使用して、コンパイル済みのPythonモジュールを格納するために使用されるPythonのコードオブジェクトを処理する方法を示しています。

このコードは、組み込みのcompile()関数を使用して、Python命令を埋め込んだソース文字列からコードオブジェクトを構築します。

compile(source, file, mode)

fileパラメータは、コードが読み取られたファイルである必要があります。ファイルから読み取られなかった場合は、任意の文字列を渡します。

モードパラメータは、ソースに一連のステートメントが含まれている場合は「exec」、単一の式がある場合は「eval」、単一のインタラクティブステートメントが含まれている場合は「single」です。

コンパイルコードオブジェクトは、dump()関数を使用して.pycファイルに保存されます

import marshal
script = """
a = 10
b = 20
print ('addition = ',a+b)
"""
code = compile(script, "script", "exec")
f = open("a.pyc","wb")
marshal.dump(code, f)
f.close()

.pycファイルからオブジェクトを逆シリアル化するには、load()関数を使用します。コードオブジェクトを返すため、別の組み込み関数であるexec()を使用して実行できます。

import marshal
f = open("a.pyc","rb")
data = marshal.load(f)
exec (data)

出力は、ソース文字列に埋め込まれたコードブロックの結果になります

addition = 30

  1. Pythonの内部動作

    この記事では、Pythonの内部動作と、Pythonインタープリターによってさまざまなオブジェクトがメモリ内のスペースに割り当てられる方法について学習します。 Pythonは、Javaのようなオブジェクト指向プログラミング構築言語です。 Pythonはインタプリタを使用するため、インタプリタ言語と呼ばれます。 Pythonは、読みやすさを向上させ、時間とスペースの複雑さを最小限に抑えるために、ミニマリズムとモジュール性をサポートしています。 Pythonの標準実装は「cpython」と呼ばれ、cコードを使用してPythonで出力を取得できます。 Pythonは、ソースコードを一連のバイトコ

  2. Pythonでのリストの内部動作

    このチュートリアルでは、Python3.xでのリストの内部動作について学習します。またはそれ以前。また、各ステップでpythonステートメントを作成するときに、オブジェクトとフレームの形成についても見ていきます。 リストの初期化:これは、いくつかの要素を含むリストを作成していることを意味します。 >>> lis=[1,2,3,4] ここで、リスト変数は、上記のようにリストオブジェクトを参照しているグローバルフレームで宣言されています 次に、リストに要素を追加したときに何が起こったかを見てみましょう。 >>> lis.append(8) こ