]> granicus.if.org Git - python/commitdiff
Issue #5729: json.dumps to support using '\t' as an indent string
authorRaymond Hettinger <python@rcn.com>
Sun, 31 Oct 2010 08:00:16 +0000 (08:00 +0000)
committerRaymond Hettinger <python@rcn.com>
Sun, 31 Oct 2010 08:00:16 +0000 (08:00 +0000)
Doc/library/json.rst
Lib/json/encoder.py
Lib/json/tests/test_indent.py
Misc/NEWS

index a26001d1cb6fb43898ef0e0ec46b09e09cef0d5f..b0703a4aef604e18649be48209f3a0e3d1508580 100644 (file)
@@ -135,10 +135,12 @@ Basic Usage
    ``inf``, ``-inf``) in strict compliance of the JSON specification, instead of
    using the JavaScript equivalents (``NaN``, ``Infinity``, ``-Infinity``).
 
-   If *indent* is a non-negative integer, then JSON array elements and object
-   members will be pretty-printed with that indent level.  An indent level of 0
-   will only insert newlines.  ``None`` (the default) selects the most compact
-   representation.
+   If *indent* is a non-negative integer or string, then JSON array elements and
+   object members will be pretty-printed with that indent level.  An indent level
+   of 0 or ``""`` will only insert newlines.  ``None`` (the default) selects the
+   most compact representation. Using an integer indent indents that many spaces
+   per level.  If *indent* is a string (such at '\t'), that string is used to indent
+   each level.
 
    If *separators* is an ``(item_separator, dict_separator)`` tuple, then it
    will be used instead of the default ``(', ', ': ')`` separators.  ``(',',
index 13359856d29057ba9690550a3ee2e51f2198239a..7475f5a5443660d2e794a5380cbd4f0e378ce660 100644 (file)
@@ -259,6 +259,9 @@ def _make_iterencode(markers, _default, _encoder, _indent, _floatstr,
         tuple=tuple,
     ):
 
+    if _indent is not None and not isinstance(_indent, str):
+        _indent = ' ' * _indent
+
     def _iterencode_list(lst, _current_indent_level):
         if not lst:
             yield '[]'
@@ -271,7 +274,7 @@ def _make_iterencode(markers, _default, _encoder, _indent, _floatstr,
         buf = '['
         if _indent is not None:
             _current_indent_level += 1
-            newline_indent = '\n' + (' ' * (_indent * _current_indent_level))
+            newline_indent = '\n' + _indent * _current_indent_level
             separator = _item_separator + newline_indent
             buf += newline_indent
         else:
@@ -307,7 +310,7 @@ def _make_iterencode(markers, _default, _encoder, _indent, _floatstr,
                     yield chunk
         if newline_indent is not None:
             _current_indent_level -= 1
-            yield '\n' + (' ' * (_indent * _current_indent_level))
+            yield '\n' + _indent * _current_indent_level
         yield ']'
         if markers is not None:
             del markers[markerid]
@@ -324,7 +327,7 @@ def _make_iterencode(markers, _default, _encoder, _indent, _floatstr,
         yield '{'
         if _indent is not None:
             _current_indent_level += 1
-            newline_indent = '\n' + (' ' * (_indent * _current_indent_level))
+            newline_indent = '\n' + _indent * _current_indent_level
             item_separator = _item_separator + newline_indent
             yield newline_indent
         else:
@@ -383,7 +386,7 @@ def _make_iterencode(markers, _default, _encoder, _indent, _floatstr,
                     yield chunk
         if newline_indent is not None:
             _current_indent_level -= 1
-            yield '\n' + (' ' * (_indent * _current_indent_level))
+            yield '\n' + _indent * _current_indent_level
         yield '}'
         if markers is not None:
             del markers[markerid]
index 605516230fb4bb9635203bcc88209f2706953ddc..ddf88cd4afcfd27949db8c48017a4fa19eefbd77 100644 (file)
@@ -10,32 +10,36 @@ class TestIndent(TestCase):
 
         expect = textwrap.dedent("""\
         [
-          [
-            "blorpie"
-          ],
-          [
-            "whoops"
-          ],
-          [],
-          "d-shtaeou",
-          "d-nthiouh",
-          "i-vhbjkhnth",
-          {
-            "nifty": 87
-          },
-          {
-            "field": "yes",
-            "morefield": false
-          }
+        \t[
+        \t\t"blorpie"
+        \t],
+        \t[
+        \t\t"whoops"
+        \t],
+        \t[],
+        \t"d-shtaeou",
+        \t"d-nthiouh",
+        \t"i-vhbjkhnth",
+        \t{
+        \t\t"nifty": 87
+        \t},
+        \t{
+        \t\t"field": "yes",
+        \t\t"morefield": false
+        \t}
         ]""")
 
 
         d1 = json.dumps(h)
         d2 = json.dumps(h, indent=2, sort_keys=True, separators=(',', ': '))
+        d3 = json.dumps(h, indent='\t', sort_keys=True, separators=(',', ': '))
 
         h1 = json.loads(d1)
         h2 = json.loads(d2)
+        h3 = json.loads(d3)
 
         self.assertEquals(h1, h)
         self.assertEquals(h2, h)
-        self.assertEquals(d2, expect)
+        self.assertEquals(h3, h)
+        self.assertEquals(d2, expect.expandtabs(2))
+        self.assertEquals(d3, expect)
index 21dcacfdb810be2e7678e7f444ff7ca05cc5ec4d..199e4c78fe31786f3bbf81dfa55e6cd5813c4d3d 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -59,6 +59,9 @@ Core and Builtins
 Library
 -------
 
+- Issue #5729:  json.dumps() now supports using a string such as '\t'
+  for pretty-printing multilevel objects.
+
 - Issue #10253: FileIO leaks a file descriptor when trying to open a file
   for append that isn't seekable.  Patch by Brian Brazil.