> ## Documentation Index
> Fetch the complete documentation index at: https://docs.sync.cdata.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Python の記述

[前提条件](https://docs.sync.cdata.com/26.4/ja/events/python-scripting/prerequisites.md)を完了すると、CData Sync はAPIScript を記述できる場所であればどこでもPython を読み取って実行できるようになります。

Sync スクリプティングエンジンにAPIScript の代わりにPython を使用するよう指示するには、以下のように`api:script` キーワードのlanguage アトリビュートを設定して、Python をスクリプト言語として定義します：

```xml theme={null}
<api:script language="python">
# Python code goes here
</api:script>
```

Python はSync スクリプティングエンジンに直接組み込まれているため、Python に慣れているユーザーは、スクリプト内でメッセージやコンテキストを操作する際に似たような構文を使用できます。

同じスクリプト内でAPIScript とPython を併用することもできます。このアプローチは、すでにAPIScript が組まれていて、Python を使用して追加のロジックを実装する必要がある場合に便利です。以下の例に示すように、Python はAPIScript で定義されたアイテムに直接アクセスできます：

```xml theme={null}
<api:set attr="CustomerA.OrderID" value="123456" />
<api:script language="python">
print("The OrderId for CustomerA is", _ctx.CustomerA.OrderID)
</api:script>
```

いくつかのPython のメソッドと変数は、Sync のメッセージ、アイテム、アトリビュートのコンテキストで動作するよう特別に設計されています。

## 組み込みオブジェクトインターフェース

Sync のPython 実装は、以下に示す組み込み変数を公開し、スクリプティングコンテキストへのアクセスを可能にする2つの主要なインターフェースを提供します。

* SyncScriptContext
* SyncScriptItem

### SyncScriptContext

このインターフェースは、Sync でのPython スクリプトの主要なスクリプティングコンテキストを表します。アイテムへの辞書のようなアクセスを提供し、ロギング機能を備えています。このインターフェースは`_ctx` 変数を公開しており、スクリプティングコンテキストへのアクセスと管理に使用します。

このインターフェースで利用可能なメソッドは以下のとおりです：

* `push`
* `log`

### SyncScriptItem

このインターフェースは、Sync のスクリプティング環境内の個々のデータアイテムを表します。アトリビュートへの辞書のようなアクセスを提供し、各アイテムの値のリストを保持します。以下の変数は、自動的に利用可能な、あらかじめインスタンス化されたSyncScriptItem オブジェクトです：

* `_input`
* `output`

このインターフェースで利用可能なメソッドは以下のとおりです：

* `get`
* `clear`

### SyncScriptContext とSyncScriptItem の仕組み

SyncScriptContext とSyncScriptItem インターフェースは連携して、スクリプト内でのデータのアクセスおよび処理方法を管理します。`_ctx` 変数はスクリプティングコンテキスト全体を表し、アイテムへのアクセスや定義を可能にします。`_ctx.itemname` という構文を使用して、スクリプト内で新しいアイテムを動的に作成したり、既存のアイテムにアクセスしたりできます。

`_input` 変数と`output` 変数は、スクリプティングコンテキスト内のデータのコンテナとして機能します。`_input` 変数は受信データを保持して公開し、`output` 変数は送信データを保持して定義します。

このモデルでは、スクリプトは通常、`_input` からデータを読み取り、`_ctx` を使用してアイテムにアクセスまたは整理し、`output` から結果を書き込みます。

詳細については、[組み込み変数](#組み込み変数)および[オペレーション](#オペレーション)を参照してください。

## 組み込み変数

組み込み変数（`_ctx`、`_input`、`output`）は、スクリプティング環境におけるメッセージコンテキストの中核へのアクセスを提供します。これらの変数を使用して、スクリプティングエンジンで利用可能なアイテムを操作します。

### \_ctx

`_ctx` 変数は、スクリプティング環境にアクセスする主要な方法です。スクリプト内で利用可能なすべてのアイテムへのアクセスを提供し、新しいアイテムの作成、アイテムのプッシュ、アプリケーションログへのエントリの書き込みを可能にします。

次の例では、`_ctx` 変数のlog メソッドを使用して、INFO レベルでアプリケーションログにエントリを書き込んでいます：

```xml theme={null}
<api:script language="python">
...Python code...
_ctx.log('INFO', 'Successfully analyzed all data!')
... more Python code...
</api:script>
```

### \_input

`_input` 変数は、スクリプティングエンジンの読み取り専用の入力アイテムを表します。利用可能なアトリビュートは、イベントを記述するコンテキストによって異なります。例えば、ジョブの後に実行されるイベントでは、以下の入力が利用可能です：

* `ConnectorId`
* `WorkspaceId`
* `MessageId`
* `FilePath`
* `FileName`
* `Attachment#`
* `Header:*`

ただし、イベントの後に実行されるイベントの場合、前のイベントからプッシュされたアウトプットのみが入力として利用可能です。

次の例では、現在のメッセージのログファイルにコネクタの名前を出力します：

```xml theme={null}
<api:script language="python">
...Python code...
print(_input.ConnectorId)
...more Python code...
</api:script>
```

この例では、入力ファイルを取得して名前を変更し、元の名前をログに記録してから、新しい名前で同じファイルをプッシュします：

```xml theme={null}
<api:script language="python">
originalname = _input.Filename
print("The original filename was ", originalname)
output.Filename = "mynewfile.xml"
output.Filepath = _input.Filepath
</api:script>
```

この例では、入力ファイルの名前をチェックして、生鮮品か非生鮮品のアイテムを含むかどうかを判定します。その後、ファイル名に基づいて生鮮品のヘッダーと値を設定します：

```xml theme={null}
<api:script language="python">
# Check whether this is a perishable product list based on the filename
is_perishable = "perishables" in _input.FileName.lower()
# Set a perishable header and value based on the filename
output['Header:category'] = 'perishable' if is_perishable else 'non-perishable'
</api:script>
```

### output

`output` 変数は組み込みアイテムであり、1つのアウトプットのみが必要な場合に、独自のアイテムを作成してプッシュする代わりに使用できます。アウトプットとして送信するために`push()` メソッドを明示的に呼び出す必要があるカスタムアイテムとは異なり、`output` アイテムはスクリプトが完了すると自動的にプッシュされます。プロパティを変更するだけで、スクリプトの実行完了後に追加の`push()` 呼び出しを行うことなく、自動的にアウトプットとしてプッシュされます。

アイテムに直接アトリビュートを設定することも、辞書（`dict`）を使用して定義することもでき、自分で定義したアイテムでも同じことができます。次の例では、いくつかのデータを含むアウトプットファイルをプッシュします：

```xml theme={null}
<api:script language="python">
output = {'data': 'This is a test',
          'filename': 'foo.txt'}
</api:script>
```

次の例では、入力ファイルを取得して名前を変更し、元の名前をログに記録してから、新しい名前で同じファイルをプッシュします：

```xml theme={null}
<api:script language="python">
originalname = _input.Filename
print("The original filename was ", originalname)
output.Filename = "mynewfile.xml"
output.Filepath = _input.Filepath
</api:script>
```

## オペレーション

スクリプティング環境では、スクリプティングコンテキストおよびアイテムを操作するために、以下のオペレーションを利用できます。

* `clear`
* `get`
* `log`
* `push`

これらのオペレーションにより、情報のログ記録、アイテムのアウトプットの管理、アイテムのアトリビュートへのアクセスまたは変更が可能になります。

### clear

`clear()` オペレーションは、メソッドが呼び出されたSyncScriptItem をクリアします。アイテム自体は残りますが、空になります。

```xml theme={null}
<api:script language="python">
product = _ctx.product
product.name = 'Milk'
product.price = '2.99'
product.tags = ['perishable', 'dairy', 'noreturn']
print("Before clear:", product)
# Use the clear() method to remove all items
product.clear()
print("After clear:", product)
</api:script>
```

前の例では、次のアウトプットが生成されます：

```xml theme={null}
Before clear: {"price":"2.99","name":"Milk","tags":["perishable","dairy","noreturn"]}
After clear: {}
```

### get

`get(attr)` オペレーションは、SyncScriptItem 上の指定したアトリビュートの値を返します。このオペレーションは、名前によってアイテムのアトリビュートにアクセスするプログラム的な方法を提供します。これは、ドット記法を使用してアトリビュートに直接アクセスする方法（例：`_input.myattr`）や、辞書形式でアクセスする方法（例：`_input.get('myattr')`）と機能的に同等です。

次の例では、`item` オブジェクトの`tags` アトリビュートの値のリストを、現在のスクリプトのログファイルに出力します：

```xml theme={null}
<api:script language="python">
item = _ctx.item
item.name = 'Milk'
item.price = '2.99'
item.tags = ['perishable', 'dairy', 'noreturn']
print(item.get('tags'))
</api:script>
```

### log

`_ctx` 変数で利用できる`log(level, message)` オペレーションは、Sync アプリケーションログに直接エントリを書き込むことができます。利用可能なログレベルは、DEBUG、INFO、WARNING、ERROR です。

次の例では、特定のコネクタでデータ評価が失敗した際に、Python のロギングコンテキストを使用してエラーレベルのメッセージを記録します：

```xml theme={null}
<api:script language="python">
...Python code...
_ctx.log('ERROR', f'Data evaluation failed in connector {_input.ConnectorId}!')
...more Python code...
</api:script>
```

### push

`push(item)` オペレーションは、指定したアイテムをスクリプトのアウトプットとしてプッシュします。アイテムが指定されていない場合、現在のアウトプットアイテムがプッシュされます。

次の例では、SyncScriptContext に新しいアイテム（`foo`）を作成し、データとファイル名を割り当てた後、プッシュしています。

```xml theme={null}
<api:script language="python">
foo = _ctx.foo
foo.Filename = "test2.txt"
foo.Data = "bar"
_ctx.push(foo)
</api:script>
```


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.