データ統合Python基本的な変換デバッグ

注: 以下の翻訳の正確性は検証されていません。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を定義 nums = [] # addメソッドで、numsリストに数値nを追加する def add(self, n): self.nums.append(n) # sumメソッドで、numsリスト内の数値の合計を計算する def sum(self): return sum(self.nums) # avgメソッドで、numsリスト内の数値の平均を計算する def avg(self): return self.sum() / len(self.nums) def main(): # Statisticsクラスのインスタンスを作成 stats = Statistics() # 数値を追加 stats.add(1) stats.add(2) stats.add(3) # 平均を計算して出力 print stats.avg()
  • 注意: Pythonのバージョンが2.xの場合は、printステートメントの後ろに括弧が必要ないです。Python3.xでは、括弧が必要です。例えば、print(stats.avg())のようになります。 このコードを実行すると、次のトレースバックが表示されます:
Copied!
1 2 3 4 5 6 Traceback (most recent call last): # 最も最近のエラーを追跡 File "test.py", line 26, in <module> # "test.py"というファイルの26行目でエラーが発生 main() # main関数を実行 File "test.py", line 16, in main # "test.py"というファイルのmain関数の16行目でエラーが発生 stats = Statistics() # Statisticsという名前のクラスまたは関数を呼び出し、その結果をstatsに代入 NameError: global name 'Statistics' is not defined # エラーメッセージ:グローバル名'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 14 15 16 17 # 以下のコードは、データセットを読み込み、そのサイズをログに記録し、データセットをそのまま返す関数です。 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 # 入力データセットをそのまま返す