注: 以下の翻訳の正確性は検証されていません。AIPを利用して英語版の原文から機械的に翻訳されたものです。
このガイドでは、Transforms Pythonで利用できるデバッグ手法の概要を説明します。 エラーや例外に関する詳細は Pythonドキュメント ↗で確認できます。
Pythonトランスフォームをデバッグするための便利なツールは、Code Repositories Debuggerです。デバッガーについて詳しく学ぶ。
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 # 入力データセットをそのまま出力