diff options
author | Bob Ippolito <bob@redivi.com> | 2017-11-23 13:36:13 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-11-23 13:36:13 -0800 |
commit | 9127262d5c5ddc572c298ecd9f99fd426a9e9584 (patch) | |
tree | 047703bb892c670002809b43a5972c9c85e46bc1 /simplejson | |
parent | db043ca417f328f3bfc1ce36ab0ea8bab9f257c5 (diff) | |
parent | 5c57849b24fae8c071cbf62f205046d8120a0c80 (diff) | |
download | simplejson-9127262d5c5ddc572c298ecd9f99fd426a9e9584.tar.gz |
Merge pull request #191 from simplejson/type-error-messages
Make TypeError messages contain type name instead of a repr.
Diffstat (limited to 'simplejson')
-rw-r--r-- | simplejson/__init__.py | 3 | ||||
-rw-r--r-- | simplejson/_speedups.c | 4 | ||||
-rw-r--r-- | simplejson/encoder.py | 6 | ||||
-rw-r--r-- | simplejson/tests/test_errors.py | 19 |
4 files changed, 27 insertions, 5 deletions
diff --git a/simplejson/__init__.py b/simplejson/__init__.py index 32a4875..ca8e7b5 100644 --- a/simplejson/__init__.py +++ b/simplejson/__init__.py @@ -77,7 +77,8 @@ Specializing JSON object encoding:: >>> def encode_complex(obj): ... if isinstance(obj, complex): ... return [obj.real, obj.imag] - ... raise TypeError(repr(o) + " is not JSON serializable") + ... raise TypeError('Object of type %s is not JSON serializable' % + ... obj.__class__.__name__) ... >>> json.dumps(2 + 1j, default=encode_complex) '[2.0, 1.0]' diff --git a/simplejson/_speedups.c b/simplejson/_speedups.c index f463c04..017e7ae 100644 --- a/simplejson/_speedups.c +++ b/simplejson/_speedups.c @@ -680,7 +680,9 @@ encoder_stringify_key(PyEncoderObject *s, PyObject *key) Py_INCREF(Py_None); return Py_None; } - PyErr_SetString(PyExc_TypeError, "keys must be a string"); + PyErr_Format(PyExc_TypeError, + "keys must be str, int, float, bool or None, " + "not %.100s", key->ob_type->tp_name); return NULL; } diff --git a/simplejson/encoder.py b/simplejson/encoder.py index c87468a..25ddf25 100644 --- a/simplejson/encoder.py +++ b/simplejson/encoder.py @@ -258,7 +258,8 @@ class JSONEncoder(object): return JSONEncoder.default(self, o) """ - raise TypeError(repr(o) + " is not JSON serializable") + raise TypeError('Object of type %s is not JSON serializable' % + o.__class__.__name__) def encode(self, o): """Return a JSON string representation of a Python data structure. @@ -541,7 +542,8 @@ def _make_iterencode(markers, _default, _encoder, _indent, _floatstr, elif _skipkeys: key = None else: - raise TypeError("key " + repr(key) + " is not a string") + raise TypeError('keys must be str, int, float, bool or None, ' + 'not %s' % key.__class__.__name__) return key def _iterencode_dict(dct, _current_indent_level): diff --git a/simplejson/tests/test_errors.py b/simplejson/tests/test_errors.py index 8dede38..78f25a5 100644 --- a/simplejson/tests/test_errors.py +++ b/simplejson/tests/test_errors.py @@ -7,7 +7,24 @@ from simplejson.compat import u, b class TestErrors(TestCase): def test_string_keys_error(self): data = [{'a': 'A', 'b': (2, 4), 'c': 3.0, ('d',): 'D tuple'}] - self.assertRaises(TypeError, json.dumps, data) + try: + json.dumps(data) + except TypeError: + err = sys.exc_info()[1] + else: + self.fail('Expected TypeError') + self.assertEqual(str(err), + 'keys must be str, int, float, bool or None, not tuple') + + def test_not_serializable(self): + try: + json.dumps(json) + except TypeError: + err = sys.exc_info()[1] + else: + self.fail('Expected TypeError') + self.assertEqual(str(err), + 'Object of type module is not JSON serializable') def test_decode_error(self): err = None |