visit_Assert(self, node): if isinstance(node.test, ast.Compare) and len(node.test.ops) == 1 and isinstance(node.test.ops[0], ast.Eq): call = ast.Call( func=ast.Name( id='customized_assert', ctx=ast.Load()), args=[node.test.left, node.test.comparators[0], ast.Constant(value=node.lineno)], keywords=[] ) expr = ast.Expr(value=call) return expr return node def customized_assert(left, right, lineno): assertion_msg = None if isinstance(left, list) and isinstance(right, list): if len(left) != len(right): assertion_msg = f"length of the list is different. left:{len(left)} right:{len(right)}" else: if left != right: indexs_with_diff = [] for i, (l, r) in enumerate(zip(left, right)): if l != r: indexs_with_diff.append(i) assertion_msg = f"left:{left}, right:{right}, index {indexs_with_diff} is different" else: if left != right: assertion_msg = f"left: {left}, right: {right}" if assertion_msg is not None: print(f"Assertion Error: {assertion_msg} @ L{lineno}") 実装⽅針: assert関数を、より 詳細な情報を出⼒できる別の関数 に差し替える。 ①:NodeTransformerを継承した クラスを作成。 ②:差し替え対象が、2値間の同 値⽐較であることをチェックする (今回はそれ以外はサポートせず)。 ③:assert差し替え先のノードを 作成し、これを返す。 ④:型をチェックしてlist型なら、 詳細な情報を表⽰する。 ① ② ③ ④