From fa74c3e05044d227ba47a949a755eee99031c21d Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Thu, 4 Jun 2026 14:52:41 +0300 Subject: [PATCH] gh-82312: Further improvement of error messages for generating AST nodes This is a follow up of GH-17715. * Use %T instead of _PyType_Name(). * Add the wrong type name we got for identifier and string. --- Lib/test/test_ast/test_ast.py | 11 ++- Parser/asdl_c.py | 19 ++-- Python/Python-ast.c | 175 +++++++++++++++++----------------- 3 files changed, 105 insertions(+), 100 deletions(-) diff --git a/Lib/test/test_ast/test_ast.py b/Lib/test/test_ast/test_ast.py index fd3b33bab7f833..31e218df127ae6 100644 --- a/Lib/test/test_ast/test_ast.py +++ b/Lib/test/test_ast/test_ast.py @@ -1098,10 +1098,17 @@ def test_required_field_messages(self): ): compile(expr_with_wrong_body, "", "eval") + variable = ast.parse("test", mode="eval") + variable.body.id = b'test' + with self.assertRaisesRegex(TypeError, + "field 'id' was expecting a string object, got bytes" + ): + compile(variable, "", "eval") + constant = ast.parse("u'test'", mode="eval") constant.body.kind = 0xFF - with self.assertRaisesRegex( - TypeError, "field 'kind' was expecting a string or bytes object" + with self.assertRaisesRegex(TypeError, + "field 'kind' was expecting a string or bytes object, got int" ): compile(constant, "", "eval") diff --git a/Parser/asdl_c.py b/Parser/asdl_c.py index e2a57177d20afb..d53886866f54f8 100755 --- a/Parser/asdl_c.py +++ b/Parser/asdl_c.py @@ -554,8 +554,8 @@ def typeCheck(self, name): self.emit("return 1;", 2) self.emit("}", 1) self.emit("if (!isinstance && field != NULL) {", 1) - error = "field '%%s' was expecting node of type '%s', got '%%s'" % name - self.emit("PyErr_Format(PyExc_TypeError, \"%s\", field, _PyType_Name(Py_TYPE(obj)));" % error, 2, reflow=False) + error = "field '%%s' was expecting node of type '%s', got '%%T'" % name + self.emit("PyErr_Format(PyExc_TypeError, \"%s\", field, obj);" % error, 2, reflow=False) self.emit("return 1;", 2) self.emit("}", 1) @@ -692,7 +692,7 @@ def visitField(self, field, name, sum=None, prod=None, depth=0): self.emit("Py_ssize_t i;", depth+1) self.emit("if (!PyList_Check(tmp)) {", depth+1) self.emit("PyErr_Format(PyExc_TypeError, \"%s field \\\"%s\\\" must " - "be a list, not a %%.200s\", _PyType_Name(Py_TYPE(tmp)));" % + "be a list, not a %%T\", tmp);" % (name, field.name), depth+2, reflow=False) self.emit("goto failed;", depth+2) @@ -991,10 +991,9 @@ def visitModule(self, mod): res = 0; /* if no error occurs, this stays 0 to the end */ if (numfields < PyTuple_GET_SIZE(args)) { - PyErr_Format(PyExc_TypeError, "%.400s constructor takes at most " + PyErr_Format(PyExc_TypeError, "%T constructor takes at most " "%zd positional argument%s", - _PyType_Name(Py_TYPE(self)), - numfields, numfields == 1 ? "" : "s"); + self, numfields, numfields == 1 ? "" : "s"); res = -1; goto cleanup; } @@ -1748,7 +1747,7 @@ def visitModule(self, mod): static int obj2ast_identifier(struct ast_state *state, PyObject* obj, PyObject** out, const char* field, PyArena* arena) { if (!PyUnicode_CheckExact(obj) && obj != Py_None) { - PyErr_Format(PyExc_TypeError, "field '%s' was expecting a string object", field); + PyErr_Format(PyExc_TypeError, "field '%s' was expecting a string object, got %T", field, obj); return -1; } return obj2ast_object(state, obj, out, field, arena); @@ -1757,7 +1756,7 @@ def visitModule(self, mod): static int obj2ast_string(struct ast_state *state, PyObject* obj, PyObject** out, const char* field, PyArena* arena) { if (!PyUnicode_CheckExact(obj) && !PyBytes_CheckExact(obj)) { - PyErr_Format(PyExc_TypeError, "field '%s' was expecting a string or bytes object", field); + PyErr_Format(PyExc_TypeError, "field '%s' was expecting a string or bytes object, got %T", field, obj); return -1; } return obj2ast_object(state, obj, out, field, arena); @@ -2144,8 +2143,8 @@ class PartingShots(StaticVisitor): return -1; } if (!isinstance) { - PyErr_Format(PyExc_TypeError, "expected %s node, got %.400s", - req_name[mode], _PyType_Name(Py_TYPE(ast))); + PyErr_Format(PyExc_TypeError, "expected %s node, got %T", + req_name[mode], ast); return -1; } return 0; diff --git a/Python/Python-ast.c b/Python/Python-ast.c index 49b6bf1d12b6fa..f36072dfce098c 100644 --- a/Python/Python-ast.c +++ b/Python/Python-ast.c @@ -5303,10 +5303,9 @@ ast_type_init(PyObject *self, PyObject *args, PyObject *kw) res = 0; /* if no error occurs, this stays 0 to the end */ if (numfields < PyTuple_GET_SIZE(args)) { - PyErr_Format(PyExc_TypeError, "%.400s constructor takes at most " + PyErr_Format(PyExc_TypeError, "%T constructor takes at most " "%zd positional argument%s", - _PyType_Name(Py_TYPE(self)), - numfields, numfields == 1 ? "" : "s"); + self, numfields, numfields == 1 ? "" : "s"); res = -1; goto cleanup; } @@ -6060,7 +6059,7 @@ static int obj2ast_constant(struct ast_state *Py_UNUSED(state), PyObject* obj, static int obj2ast_identifier(struct ast_state *state, PyObject* obj, PyObject** out, const char* field, PyArena* arena) { if (!PyUnicode_CheckExact(obj) && obj != Py_None) { - PyErr_Format(PyExc_TypeError, "field '%s' was expecting a string object", field); + PyErr_Format(PyExc_TypeError, "field '%s' was expecting a string object, got %T", field, obj); return -1; } return obj2ast_object(state, obj, out, field, arena); @@ -6069,7 +6068,7 @@ static int obj2ast_identifier(struct ast_state *state, PyObject* obj, PyObject** static int obj2ast_string(struct ast_state *state, PyObject* obj, PyObject** out, const char* field, PyArena* arena) { if (!PyUnicode_CheckExact(obj) && !PyBytes_CheckExact(obj)) { - PyErr_Format(PyExc_TypeError, "field '%s' was expecting a string or bytes object", field); + PyErr_Format(PyExc_TypeError, "field '%s' was expecting a string or bytes object, got %T", field, obj); return -1; } return obj2ast_object(state, obj, out, field, arena); @@ -10886,7 +10885,7 @@ obj2ast_mod(struct ast_state *state, PyObject* obj, mod_ty* out, const char* return 1; } if (!isinstance && field != NULL) { - PyErr_Format(PyExc_TypeError, "field '%s' was expecting node of type 'mod', got '%s'", field, _PyType_Name(Py_TYPE(obj))); + PyErr_Format(PyExc_TypeError, "field '%s' was expecting node of type 'mod', got '%T'", field, obj); return 1; } tp = state->Module_type; @@ -10912,7 +10911,7 @@ obj2ast_mod(struct ast_state *state, PyObject* obj, mod_ty* out, const char* Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "Module field \"body\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "Module field \"body\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -10950,7 +10949,7 @@ obj2ast_mod(struct ast_state *state, PyObject* obj, mod_ty* out, const char* Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "Module field \"type_ignores\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "Module field \"type_ignores\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -11000,7 +10999,7 @@ obj2ast_mod(struct ast_state *state, PyObject* obj, mod_ty* out, const char* Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "Interactive field \"body\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "Interactive field \"body\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -11080,7 +11079,7 @@ obj2ast_mod(struct ast_state *state, PyObject* obj, mod_ty* out, const char* Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "FunctionType field \"argtypes\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "FunctionType field \"argtypes\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -11155,7 +11154,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, const char* return 1; } if (!isinstance && field != NULL) { - PyErr_Format(PyExc_TypeError, "field '%s' was expecting node of type 'stmt', got '%s'", field, _PyType_Name(Py_TYPE(obj))); + PyErr_Format(PyExc_TypeError, "field '%s' was expecting node of type 'stmt', got '%T'", field, obj); return 1; } if (PyObject_GetOptionalAttr(obj, state->lineno, &tmp) < 0) { @@ -11288,7 +11287,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, const char* Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "FunctionDef field \"body\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "FunctionDef field \"body\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -11326,7 +11325,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, const char* Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "FunctionDef field \"decorator_list\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "FunctionDef field \"decorator_list\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -11399,7 +11398,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, const char* Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "FunctionDef field \"type_params\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "FunctionDef field \"type_params\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -11492,7 +11491,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, const char* Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "AsyncFunctionDef field \"body\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "AsyncFunctionDef field \"body\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -11530,7 +11529,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, const char* Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "AsyncFunctionDef field \"decorator_list\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "AsyncFunctionDef field \"decorator_list\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -11603,7 +11602,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, const char* Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "AsyncFunctionDef field \"type_params\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "AsyncFunctionDef field \"type_params\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -11678,7 +11677,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, const char* Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "ClassDef field \"bases\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "ClassDef field \"bases\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -11716,7 +11715,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, const char* Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "ClassDef field \"keywords\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "ClassDef field \"keywords\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -11754,7 +11753,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, const char* Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "ClassDef field \"body\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "ClassDef field \"body\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -11792,7 +11791,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, const char* Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "ClassDef field \"decorator_list\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "ClassDef field \"decorator_list\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -11830,7 +11829,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, const char* Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "ClassDef field \"type_params\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "ClassDef field \"type_params\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -11912,7 +11911,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, const char* Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "Delete field \"targets\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "Delete field \"targets\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -11965,7 +11964,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, const char* Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "Assign field \"targets\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "Assign field \"targets\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -12070,7 +12069,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, const char* Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "TypeAlias field \"type_params\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "TypeAlias field \"type_params\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -12326,7 +12325,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, const char* Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "For field \"body\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "For field \"body\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -12364,7 +12363,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, const char* Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "For field \"orelse\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "For field \"orelse\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -12471,7 +12470,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, const char* Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "AsyncFor field \"body\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "AsyncFor field \"body\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -12509,7 +12508,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, const char* Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "AsyncFor field \"orelse\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "AsyncFor field \"orelse\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -12598,7 +12597,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, const char* Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "While field \"body\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "While field \"body\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -12636,7 +12635,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, const char* Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "While field \"orelse\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "While field \"orelse\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -12706,7 +12705,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, const char* Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "If field \"body\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "If field \"body\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -12744,7 +12743,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, const char* Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "If field \"orelse\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "If field \"orelse\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -12797,7 +12796,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, const char* Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "With field \"items\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "With field \"items\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -12835,7 +12834,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, const char* Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "With field \"body\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "With field \"body\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -12906,7 +12905,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, const char* Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "AsyncWith field \"items\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "AsyncWith field \"items\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -12944,7 +12943,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, const char* Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "AsyncWith field \"body\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "AsyncWith field \"body\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -13031,7 +13030,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, const char* Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "Match field \"cases\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "Match field \"cases\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -13133,7 +13132,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, const char* Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "Try field \"body\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "Try field \"body\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -13171,7 +13170,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, const char* Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "Try field \"handlers\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "Try field \"handlers\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -13209,7 +13208,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, const char* Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "Try field \"orelse\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "Try field \"orelse\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -13247,7 +13246,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, const char* Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "Try field \"finalbody\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "Try field \"finalbody\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -13301,7 +13300,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, const char* Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "TryStar field \"body\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "TryStar field \"body\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -13339,7 +13338,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, const char* Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "TryStar field \"handlers\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "TryStar field \"handlers\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -13377,7 +13376,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, const char* Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "TryStar field \"orelse\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "TryStar field \"orelse\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -13415,7 +13414,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, const char* Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "TryStar field \"finalbody\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "TryStar field \"finalbody\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -13515,7 +13514,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, const char* Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "Import field \"names\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "Import field \"names\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -13603,7 +13602,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, const char* Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "ImportFrom field \"names\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "ImportFrom field \"names\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -13688,7 +13687,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, const char* Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "Global field \"names\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "Global field \"names\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -13739,7 +13738,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, const char* Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "Nonlocal field \"names\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "Nonlocal field \"names\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -13864,7 +13863,7 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, const char* return 1; } if (!isinstance && field != NULL) { - PyErr_Format(PyExc_TypeError, "field '%s' was expecting node of type 'expr', got '%s'", field, _PyType_Name(Py_TYPE(obj))); + PyErr_Format(PyExc_TypeError, "field '%s' was expecting node of type 'expr', got '%T'", field, obj); return 1; } if (PyObject_GetOptionalAttr(obj, state->lineno, &tmp) < 0) { @@ -13975,7 +13974,7 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, const char* Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "BoolOp field \"values\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "BoolOp field \"values\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -14303,7 +14302,7 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, const char* Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "Dict field \"keys\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "Dict field \"keys\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -14341,7 +14340,7 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, const char* Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "Dict field \"values\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "Dict field \"values\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -14392,7 +14391,7 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, const char* Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "Set field \"elts\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "Set field \"elts\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -14461,7 +14460,7 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, const char* Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "ListComp field \"generators\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "ListComp field \"generators\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -14530,7 +14529,7 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, const char* Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "SetComp field \"generators\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "SetComp field \"generators\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -14617,7 +14616,7 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, const char* Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "DictComp field \"generators\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "DictComp field \"generators\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -14686,7 +14685,7 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, const char* Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "GeneratorExp field \"generators\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "GeneratorExp field \"generators\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -14846,7 +14845,7 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, const char* Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "Compare field \"ops\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "Compare field \"ops\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -14884,7 +14883,7 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, const char* Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "Compare field \"comparators\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "Compare field \"comparators\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -14954,7 +14953,7 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, const char* Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "Call field \"args\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "Call field \"args\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -14992,7 +14991,7 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, const char* Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "Call field \"keywords\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "Call field \"keywords\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -15195,7 +15194,7 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, const char* Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "JoinedStr field \"values\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "JoinedStr field \"values\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -15246,7 +15245,7 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, const char* Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "TemplateStr field \"values\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "TemplateStr field \"values\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -15574,7 +15573,7 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, const char* Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "List field \"elts\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "List field \"elts\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -15643,7 +15642,7 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, const char* Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "Tuple field \"elts\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "Tuple field \"elts\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -16131,7 +16130,7 @@ obj2ast_comprehension(struct ast_state *state, PyObject* obj, comprehension_ty* Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "comprehension field \"ifs\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "comprehension field \"ifs\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -16203,7 +16202,7 @@ obj2ast_excepthandler(struct ast_state *state, PyObject* obj, excepthandler_ty* return 1; } if (!isinstance && field != NULL) { - PyErr_Format(PyExc_TypeError, "field '%s' was expecting node of type 'excepthandler', got '%s'", field, _PyType_Name(Py_TYPE(obj))); + PyErr_Format(PyExc_TypeError, "field '%s' was expecting node of type 'excepthandler', got '%T'", field, obj); return 1; } if (PyObject_GetOptionalAttr(obj, state->lineno, &tmp) < 0) { @@ -16332,7 +16331,7 @@ obj2ast_excepthandler(struct ast_state *state, PyObject* obj, excepthandler_ty* Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "ExceptHandler field \"body\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "ExceptHandler field \"body\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -16395,7 +16394,7 @@ obj2ast_arguments(struct ast_state *state, PyObject* obj, arguments_ty* out, Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "arguments field \"posonlyargs\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "arguments field \"posonlyargs\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -16433,7 +16432,7 @@ obj2ast_arguments(struct ast_state *state, PyObject* obj, arguments_ty* out, Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "arguments field \"args\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "arguments field \"args\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -16488,7 +16487,7 @@ obj2ast_arguments(struct ast_state *state, PyObject* obj, arguments_ty* out, Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "arguments field \"kwonlyargs\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "arguments field \"kwonlyargs\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -16526,7 +16525,7 @@ obj2ast_arguments(struct ast_state *state, PyObject* obj, arguments_ty* out, Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "arguments field \"kw_defaults\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "arguments field \"kw_defaults\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -16581,7 +16580,7 @@ obj2ast_arguments(struct ast_state *state, PyObject* obj, arguments_ty* out, Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "arguments field \"defaults\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "arguments field \"defaults\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -17108,7 +17107,7 @@ obj2ast_match_case(struct ast_state *state, PyObject* obj, match_case_ty* out, Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "match_case field \"body\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "match_case field \"body\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -17163,7 +17162,7 @@ obj2ast_pattern(struct ast_state *state, PyObject* obj, pattern_ty* out, const return 1; } if (!isinstance && field != NULL) { - PyErr_Format(PyExc_TypeError, "field '%s' was expecting node of type 'pattern', got '%s'", field, _PyType_Name(Py_TYPE(obj))); + PyErr_Format(PyExc_TypeError, "field '%s' was expecting node of type 'pattern', got '%T'", field, obj); return 1; } if (PyObject_GetOptionalAttr(obj, state->lineno, &tmp) < 0) { @@ -17316,7 +17315,7 @@ obj2ast_pattern(struct ast_state *state, PyObject* obj, pattern_ty* out, const Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "MatchSequence field \"patterns\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "MatchSequence field \"patterns\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -17369,7 +17368,7 @@ obj2ast_pattern(struct ast_state *state, PyObject* obj, pattern_ty* out, const Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "MatchMapping field \"keys\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "MatchMapping field \"keys\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -17407,7 +17406,7 @@ obj2ast_pattern(struct ast_state *state, PyObject* obj, pattern_ty* out, const Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "MatchMapping field \"patterns\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "MatchMapping field \"patterns\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -17495,7 +17494,7 @@ obj2ast_pattern(struct ast_state *state, PyObject* obj, pattern_ty* out, const Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "MatchClass field \"patterns\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "MatchClass field \"patterns\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -17533,7 +17532,7 @@ obj2ast_pattern(struct ast_state *state, PyObject* obj, pattern_ty* out, const Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "MatchClass field \"kwd_attrs\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "MatchClass field \"kwd_attrs\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -17571,7 +17570,7 @@ obj2ast_pattern(struct ast_state *state, PyObject* obj, pattern_ty* out, const Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "MatchClass field \"kwd_patterns\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "MatchClass field \"kwd_patterns\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -17701,7 +17700,7 @@ obj2ast_pattern(struct ast_state *state, PyObject* obj, pattern_ty* out, const Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "MatchOr field \"patterns\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); + PyErr_Format(PyExc_TypeError, "MatchOr field \"patterns\" must be a list, not a %T", tmp); goto failed; } len = PyList_GET_SIZE(tmp); @@ -17756,7 +17755,7 @@ obj2ast_type_ignore(struct ast_state *state, PyObject* obj, type_ignore_ty* return 1; } if (!isinstance && field != NULL) { - PyErr_Format(PyExc_TypeError, "field '%s' was expecting node of type 'type_ignore', got '%s'", field, _PyType_Name(Py_TYPE(obj))); + PyErr_Format(PyExc_TypeError, "field '%s' was expecting node of type 'type_ignore', got '%T'", field, obj); return 1; } tp = state->TypeIgnore_type; @@ -17836,7 +17835,7 @@ obj2ast_type_param(struct ast_state *state, PyObject* obj, type_param_ty* out, return 1; } if (!isinstance && field != NULL) { - PyErr_Format(PyExc_TypeError, "field '%s' was expecting node of type 'type_param', got '%s'", field, _PyType_Name(Py_TYPE(obj))); + PyErr_Format(PyExc_TypeError, "field '%s' was expecting node of type 'type_param', got '%T'", field, obj); return 1; } if (PyObject_GetOptionalAttr(obj, state->lineno, &tmp) < 0) { @@ -18571,8 +18570,8 @@ int PyAst_CheckMode(PyObject *ast, int mode) return -1; } if (!isinstance) { - PyErr_Format(PyExc_TypeError, "expected %s node, got %.400s", - req_name[mode], _PyType_Name(Py_TYPE(ast))); + PyErr_Format(PyExc_TypeError, "expected %s node, got %T", + req_name[mode], ast); return -1; } return 0;