データ接続と統合概要基本的な変換デバッグ

注: 以下の翻訳の正確性は検証されていません。AIPを利用して英語版の原文から機械的に翻訳されたものです。

デバッグ

このガイドでは、Transforms Pythonで利用できるデバッグ手法の概要を説明します。 エラーや例外に関する詳細は Pythonドキュメント ↗で確認できます。

デバッガーの使用

Pythonトランスフォームをデバッグするための便利なツールは、Code Repositories Debuggerです。デバッガーについて詳しく学ぶ。

Pythonのトレースバックを読む

Pythonのトレースバックは、Javaのスタックトレースに相当します。Pythonでは、未処理の例外が残されるとトレースバックが発生し、エラーメッセージを含むスタックトレースが表示されます。 ほとんどのTransforms Pythonランタイムの失敗はトレースバックとして表れるため、トレースバックの読み方を理解することが重要です。

次のコード例を考えてみましょう:

Copied!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 class Stats(object): # 数値を格納するリスト nums = [] # 数値をリストに追加するメソッド def add(self, n): self.nums.append(n) # リスト内の数値の合計を返すメソッド def sum(self): return sum(self.nums) # リスト内の数値の平均を返すメソッド def avg(self): return self.sum() / len(self.nums) def main(): stats = Stats() # クラス名の誤り修正: Statistics -> Stats stats.add(1) stats.add(2) stats.add(3) print(stats.avg()) # 平均値を出力 # main() 関数を実行 main()

このコードを実行すると、次のトレースバックが表示されます:

Copied!
1 2 3 4 5 6 Traceback (most recent call last): File "test.py", line 26, in <module> # "test.py" の 26行目の <module> 内で例外が発生 main() File "test.py", line 16, in main # "test.py" の 16行目の main 関数内で例外が発生 stats = Statistics() NameError: global name 'Statistics' is not defined # NameError: 'Statistics' という名前が定義されていない

Statistics クラスが定義されていないか、インポートされていないことが原因です。 Statistics クラスを定義するか、適切なモジュールからインポートしてください。 Java のスタックトレースとは異なり、Python のトレースバックは最新の呼び出しを最後に表示します。したがって、下から上に読むと、トレースバックは以下を示します:

  • 例外名:NameError組み込みの Python 例外クラス ↗は多数ありますが、コードで独自の例外クラスを定義することも可能です。
  • 例外メッセージ:global name 'Statistics' is not defined。 このメッセージには、デバッグの目的で最も役立つ情報が含まれています。
  • スローされた例外までの関数呼び出しの順序:File "test.py", line 26, in <module> その後に問題のあるコード行(16行目)。

このトレースバックを使用すると、例外が test.py の16行目の main メソッドで発生していることがわかります。具体的には、エラーを引き起こすコード行は stats = Statistics() で、スローされる例外は NameError です。これから、「Statistics」という名前が存在しないと推測できます。サンプルコードを見直すと、「Statistics」の代わりに「Stats」を使用するつもりだったようです。

ロギング

標準の Python ロギングモジュール ↗を使用するべきです。

ログの読み取りに関する情報をさらに詳しく知るために、ログの読み取りに関するセクションを参照してください。

INFO レベルのログとそれ以上のレベルのログのみが保存されます。

以下のコード例は、デバッグに役立つログを出力する方法を示しています:

Copied!
1 2 3 4 5 6 7 8 9 10 11 12 13 from transforms.api import transform_df, Input, Output from myproject.datasets import utils import logging log = logging.getLogger(__name__) @transform_df( Output("/path/to/output/dataset"), # 出力データセットのパスを指定 my_input=Input("/path/to/input/dataset"), # 入力データセットのパスを指定 ) def my_compute_function(my_input): log.info("Input size: %d", my_input.count()) # 入力データセットのサイズをログに記録 return my_input # 入力データセットをそのまま出力