記事
· 17 hr 前 2m read

%DynamicObjectを外部Pythonの引数に利用する方法

IRISでPythonを扱う時に、既存の%DynamicObject型の値をそのまま利用したいと思うのですが、Embedded Pythonは自動で%DynamicObjectをdict型にはしてくれません。親和性はとてもあるのですが。。。

そこで、既存プログラムで生成した%DynamicObject型の値をPython側、特に外部のPythonファイル側でdict型を期待している関数に利用するにはどうすれば良いか。

少しスマートではありませんが、%DynamicObjectを一旦JSON文字列に置き換え、Embedded Python 内でJSON文字列からdict型に変換する方法しかないようです。
以下が、その手順です。

Set data = {}
Set data.name = "hanako"
Set data.age = 20

Do ..testPython(data)

ClassMethod testPython(arg As %DynamicObject) [ Language = python ]
{
    import json
    import pythonfile

    data = json.loads(arg._ToJSON())
    pythonfile.test(data)
}

pythonfile.py

def test(arg):
    name = arg.name
    age = arg.age

arg._ToJSON()で%DynamicObject型の値をJSON文字列に変換し、更に、json.loads()でJSON文字列をdict型に置き換えています。
"_ToJSON"は、%DynamicObject型の%ToJSONメソッドです。

Pythonファイルの関数からdict型で戻り値がある場合には、この逆を行えば%DynamicObjectで戻すことが出来ます。

Set data = {}
Set data.name = "hanako"
Set data.age = 20

Set sc =  ..testPython(data)
Write sc.status,!

ClassMethod testPython(arg As %DynamicObject) As %DynamicObject [ Language = python ]
{
    import json
    import pythonfile

    result = {}

    data = json.loads(arg._ToJSON())
    re = pythonfile.test(data)
    result.fromJSON(json.dumps(re))

    return result
}

pythonfile.py

def test(arg):
    result = {
        "age":arg.age,
        "status":"ok"
    }

    return result

これで、既存のCOSプログラムと、既存のPythonプログラムを更に有効活用出来るようになります。

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