IRISでのPython入門

Pythonとその機能についてよく理解できたところで、IRIS内でPythonをどのように活用できるのか見ていきましょう。
言語タグ
言語タグは、ObjectScriptクラスに直接Pythonコードを書くことができるIRIS機能です。
これは、迅速にプロトタイピングしたいときや、別のPythonスクリプトを作成せずにPythonの機能を使用する場合に役立ちます。
使用方法
言語タグを使用するには、Language = python 属性を持つクラスメソッドを定義する必要があります。 以下に例を示します。
Class Article.LanguageTagExample Extends %RegisteredObject
{
ClassMethod Run() [ Language = python ]
{
import requests
response = requests.get("https://2eb86668f7ab407989787c97ec6b24ba.api.mockbin.io/")
my_dict = response.json()
for key, value in my_dict.items():
print(f"{key}: {value}") # print message: Hello World
}
}
言語タグを使用する際のメリットとデメリットは何ですか?
メリット
- 簡素化:別のPythonファイルを作成する必要なしにObjectScriptクラスに直接Pythonコードを書くことができます。
- 迅速なプロトタイピング:迅速なプロトタイピングや、Pythonの短いコードをテストするのに最適です。
- 統合:PythonコードをObjectScriptコードと簡単に統合できます
デメリット
- 混合コード:PythonとObjectScriptコードを混合すると、読みづらく保守しにくくなります。
- デバッグ:言語タグで書かれたPythonコードはリモートでデバッグできません。これは複雑なアプリケーションには制約となることがあります。
- トレースバック:Pythonトレースバックは表示されず、ObjectScriptエラーメッセージのみが表示されます。これはデバッグをより難しくしています。
まとめ
言語タグは、ObjectScriptクラスに直接Pythonコードを書くことができる強力な機能です。 しかし、制限があり、適切に使用することが大切です。 より大規模なプロジェクトや、Pythonコードをデバッグする必要がある場合は、別のPythonスクリプトを作成し、ObjectScriptにインポートすることをおすすめです。
Pythonモジュールのインポート(pypiモジュール)
Pythonとその機能についてよく理解できたところで、ObjectscriptにPythonをインポートする方法について見ていきましょう。
最初に、組み込みモジュールや requests、numpy などのPyPIからのサードパーティモジュールでのみ行います。
使用方法
ここでも同じことを行いますが、PyPIからのrequestsモジュールのみを使用します。
Class Article.RequestsExample Extends %RegisteredObject
{
ClassMethod Run() As %Status
{
set builtins = ##class(%SYS.Python).Import("builtins")
Set requests = ##class(%SYS.Python).Import("requests")
Set response = requests.get("https://2eb86668f7ab407989787c97ec6b24ba.api.mockbin.io/")
Set myDict = response.json()
for i=0:1:builtins.len(myDict)-1 {
set key = builtins.list(myDict.keys())."__getitem__"(i)
set value = builtins.list(myDict.values())."__getitem__"(i)
write key, ": ", value, !
}
}
}
実行しましょう。
iris session iris -U IRISAPP '##class(Article.RequestsExample).Run()'
出力が表示されます。
message: Hello World
メリット
- Pythonへのアクセス:PyPIにあるPythonライブラリを使用できます。これにより、ライブラリとツールの膨大なエコシステムにアクセスできます。
- 1つの種類のコード:ObjectScriptコードのみで記述するため、読みやすく、保守しやすくなります。
- デバッグ:ObjectScriptのコードとしてそのままデバッグできます。というのも、実際にObjectScriptであるためです :)
デメリット
- Pythonについての十分な知識:Pythonライブラリを効率的に使用するには、Pythonについての十分な知識が必要です。
- 例については、ダンダ―メソッドについての記事をご覧ください。
- Pythonコードを書いてはいない:Pythonコードを書いているのではなく、Pythonを呼び出すObjectScriptコードを書いています。そうすることで、Pythonのシンタックスシュガーを回避します。
まとめ
まとめると、PythonモジュールをObjectScriptにインポートすることで、Pythonライブラリの膨大なエコシステムを活用してアプリケーション機能を大幅に向上させます。 しかし、Pythonに精通している必要があるなど、トレードオフがあることを理解することが不可欠です。
Pythonモジュールのインポート(カスタムモジュール)
引き続き同じ例を見ていきますが、今回はカスタムのPythonモジュールを作成してObjectScriptにインポートしましょう。
今回はできるだけpythonを使用し、Pythonコードを呼び出すためにObjectscriptのみを使用します。
使用方法
以下のコンテンツが含む my_script.py という名前のカスタムPythonモジュールを作成しましょう。
import requests
def run():
response = requests.get("https://2eb86668f7ab407989787c97ec6b24ba.api.mockbin.io/")
my_dict = response.json()
for key, value in my_dict.items():
print(f"{key}: {value}") # print message: Hello World
次に、インポートするObjectScriptクラスを作成して、このPythonモジュールを実行します。
Class Article.MyScriptExample Extends %RegisteredObject
{
ClassMethod Run() As %Status
{
set sys = ##class(%SYS.Python).Import("sys")
do sys.path.append("/irisdev/app/src/python/article") // Adjust the path to your module
Set myScript = ##class(%SYS.Python).Import("my_script")
Do myScript.run()
Quit $$$OK
}
}
では、実行しましょう。
iris session iris -U IRISAPP '##class(Article.MyScriptExample).Run()'
⚠️ IRISセッションを変更して、コードの最新バージョンで実行していることを確認してください。詳しくは、最初の記事をご覧ください。
出力が表示されます。
message: Hello World
これはカスタムのPythonモジュールをObjectScriptにインポートして、Pythonのコードを実行する方法を具体的に示しています。
メリット
- モジュール化:Pythonコードをモジュールにまとめることができ、管理と保守が容易になります。
- Python構文:Pythonの構文と機能を使用して、Pythonコードを書くことができます
- デバッグ:今回は説明しませんが、次の記事ではIRISでPythonコードをデバッグする方法を見ていきます。
デメリット
- パスの管理:Pythonモジュールへのパスを管理する必要があります。詳しくは、
sys.pathについての記事をご覧ください。 - Pythonの知識:モジュールを書いて保守するには、やはりPythonの十分な知識が必要です。
- ObjectScriptの知識:Pythonモジュールを呼び出すには、ObjectScriptの使い方を知っている必要があります。
まとめ
まとめると、PythonモジュールをObjectScriptにインポートすることで、Pythonライブラリの膨大なエコシステムを活用してアプリケーション機能を大幅に向上させます。 しかし、Pythonに精通している必要があるなど、トレードオフがあることを理解することが不可欠です。