私は解析モジュール構造を使用していて、そのデータ構造の宣言型の性質に本当に夢中になっていることに気づきました。慣れていない方のために、インスタンス化するときにオブジェクトをネストすることで、解析しようとしているものと本質的に同じように見えるPythonコードを記述できます。
例:
ethernet = Struct("ethernet_header",
Bytes("destination", 6),
Bytes("source", 6),
Enum(UBInt16("type"),
IPv4 = 0x0800,
ARP = 0x0806,
RARP = 0x8035,
X25 = 0x0805,
IPX = 0x8137,
IPv6 = 0x86DD,
),
)
コンストラクトはこの構造内に値を格納することを実際にはサポートしていませんが(抽象コンテナをバイトストリームに解析するか、バイトストリームを抽象コンテナに解析できます)、パーサーが解析中に値を格納できるようにフレームワークを拡張したいと思います。ドット表記ethernet.typeでアクセスできること。
ただし、そうすることで、ここで考えられる最善の解決策は、エンコード/デコードメカニズムを記述して、エンコード/デコードメカニズムを登録し、抽象データ構造(パーサー自体)からさまざまな出力を生成できるようにする一般的な方法であると考えてください。 )、およびパーサーの出力。
例を挙げると、デフォルトでは、パーサーを介してパックされたイーサネットを実行すると、dictのようなものになります。
Container(name='ethernet_header',
destination='\x01\x02\x03\x04\x05\x06',
source='\x01\x02\x03\x04\x05\x06',
type=IPX
)
物事を2回解析する必要はありません。理想的には、パーサーに構成可能な方法で「ターゲット」オブジェクト/文字列/バイトを生成させたいと思います。
アイデアの根本は、構造を消費または処理するためにさまざまな「プラグイン」を登録して、プログラムでXMLまたはGraphvizダイアグラムを生成したり、バイトからPythondictに変換したりできるようにすることです。タスクの核心は、ノードのツリーを歩き、エンコーダー/デコーダーに基づいて、変換されたオブジェクトを変換して返すことです。
したがって、問題は本質的に、この目的に最も適したパターンは何かということです。
コーデックスタイル:
コーデックモジュールを見てきました。これは、エンコーディングメカニズムを作成し、クラスが物事をエンコードできることを登録し、必要な特定のエンコーディングをその場で指定できるという点でかなり洗練されています。
'blah blah'.encode('utf8')
serdes(シリアライザー、デシリアライザー):
Python用の既存のserdesモジュールの例がいくつかありますが、私の頭の中でJSONが頭に浮かびますが、問題は、それが非常に具体的であり、任意の形式を簡単にサポートしないことです。JSONをエンコードまたはデコードすることができ、基本的にはそれだけです。このように構築されたさまざまなserdesがあり、ロード、*ダンプ*メソッドを使用するものもあれば、使用しないものもあります。それはクラップスです。
objects = json.loads('{'a': 1, 'b': 2})
ビジターパターン(?):
私はビジターパターンにあまり精通していませんが、適用できるメカニズムがいくつかあるようです-(これを正しく理解していれば)ノードのビジターを設定し、それを歩くという考えですツリーを作成し、いくつかの変換を適用します(そして、新しいオブジェクトを返しますか?)。私はここでぼんやりしています。
他の?:
もっとpythonicであるか、すでに書かれているかもしれない他のメカニズムはありますか?おそらくElementTreeを使用してElementsをサブクラス化することを検討しましたが、何かを行う前にstackoverflowを調べたかったのです。