summaryrefslogtreecommitdiff
path: root/simplejson
diff options
context:
space:
mode:
authorBob Ippolito <bob@redivi.com>2017-11-23 13:36:13 -0800
committerGitHub <noreply@github.com>2017-11-23 13:36:13 -0800
commit9127262d5c5ddc572c298ecd9f99fd426a9e9584 (patch)
tree047703bb892c670002809b43a5972c9c85e46bc1 /simplejson
parentdb043ca417f328f3bfc1ce36ab0ea8bab9f257c5 (diff)
parent5c57849b24fae8c071cbf62f205046d8120a0c80 (diff)
downloadsimplejson-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__.py3
-rw-r--r--simplejson/_speedups.c4
-rw-r--r--simplejson/encoder.py6
-rw-r--r--simplejson/tests/test_errors.py19
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