記事
· 2024年2月27日 5m read

もう1つの $ListBuild() の実装:Pythonライブラリ「iris-dollar-list」

1. iris-dollar-list

PyPI - Status
PyPI
GitHub
Coverage

DollarListは、Pythonのための$LIST()インタープリタです。

このインタプリタが作成された理由は以下の通りです。

  • Pythonで $LIST()を使いたいため。
  • Embedded Python で$LIST()がサポートされていないため。
  • NatveAPIでは、$LIST()の中に$LIST()のデータを埋め込むことをサポートしていないため。

この機能は、開発途中です。現時点では、$LIST()の中に、$LIST()、int 、string のデータを含めることができます。

作成中タイプ:fload、decimal、double

このモジュールはPypiで利用できます:

pip3 install iris-dollar-list

Embedde PythonとNativeAPIに対応しています。

1.1. 目次

1.2. 使用方法

実行例:

set ^list = $lb("test",$lb(4))

Native APIでの使用例:

import iris
from iris_dollar_list import DollarList

conn = iris.connect("localhost", 57161,"IRISAPP", "SuperUser", "SYS")

iris_obj = iris.createIRIS(conn)

gl = iris_obj.get("^list")

my_list = DollarList.from_bytes(gl.encode('ascii'))

print(my_list.to_list())
# ['test', [4]]

Embedded Pythonでの使用例:

import iris
from iris_dollar_list import DollarList

gl = iris.gref("^list")

my_list = DollarList.from_bytes(gl[None].encode('ascii'))

print(my_list.to_list())
# ['test', [4]]

1.3. 関数

1.3.1. append

リストに要素を追加する。

含めることのできる要素は以下の通りです:
* string
* int
* DollarList
* DollarItem

my_list = DollarList()
my_list.append("one")
my_list.append(1)
my_list.append(DollarList.from_list(["list",2]))
my_list.append(DollarItem(dollar_type=1, value="item",
                          raw_value=b"item",
                          buffer=b'\x06\x01item'))
print(DollarList.from_bytes(my_list.to_bytes()))
# $lb("one",1,$lb("list",2),"item")

1.3.2. from_bytes

byteからDollarListを作成する:

my_list = DollarList.from_bytes(b'\x05\x01one')
print(my_list)
# $lb("one")

1.3.3. from_list

PythonリストからDollarListを作成する:

print(DollarList.from_list(["list",2]))
# $lb("list",2)

1.3.4. to_bytes

DollarListからbyteへ変換する:

my_list = DollarList.from_list(["list",2])
print(my_list.to_bytes())
# b'\x06\x01list\x03\x04\x02'

1.3.5. to_list

DollarListからPythonリストに変換する:

my_list = DollarList.from_bytes(b'\x05\x01one')
print(my_list.to_list())
# ['one']

2. $list()

2.1. $list()とは ?

$list()はバイナリフォーマットでデータを格納します。IRISのエンジンで使用されています。読み書きしやすい形式でパースも簡単です。

$list()の便利なところは、保存に制限がないことです。IRISのスーパーサーバーポート(デフォルトでは1972)を使用した通信にも使用されています。

2.2. 動かし方

$list()は値のリストを格納するバイナリフォーマットです。各値はブロックに格納されます。各ブロックはヘッダとボディで構成されています。ヘッダはサイズと型で構成されます。ボディは値で構成されます。

2.2.1. ヘッダ

ヘッダはサイズとタイプで構成されます。

2.2.1.1. サイズ

サイズはブロック数を示します。サイズはNバイトで格納されます。
Nはヘッダの最初のバイトが0であるバイト数で決まります。
サイズはリトルエンディアンで格納されます。

2.2.1.2. タイプ

タイプは、値のタイプを表すバイトです。
タイプはサイズの直後に格納されています。

リストのタイプは以下の通りです:
* ascii: 0x01
* unicode: 0x02
* int: 0x04
* negative int: 0x05
* float: 0x06
* negative float: 0x07
* double: 0x08
* compact double: 0x09

2.2.2. ボディ

ボディは値で構成されます。

ボディを解析するには、値のタイプを知る必要があります。

2.2.2.1. Ascii

値を asciiとしてでコードします。

デコードに失敗した場合は、値をサブリストとみなします。

サブリストのデコードに失敗したら、値をバイナリとみなします。

2.2.2.2. Unicode

値を unicode としてデコードします。

2.2.2.3. Int

リトルエンディアンで符号なしの整数として値をパースします。

2.2.2.4. Negative Int

値をリトルエンディアンで符号付き整数としてパースします。

ディスカッション (1)1
続けるにはログインするか新規登録を行ってください