mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 07:31:38 +00:00 
			
		
		
		
	Issue #5729: json.dumps to support using '\t' as an indent string
This commit is contained in:
		
							parent
							
								
									6ff2a7d121
								
							
						
					
					
						commit
						b643ef8f8e
					
				
					 4 changed files with 38 additions and 26 deletions
				
			
		| 
						 | 
					@ -135,10 +135,12 @@ Basic Usage
 | 
				
			||||||
   ``inf``, ``-inf``) in strict compliance of the JSON specification, instead of
 | 
					   ``inf``, ``-inf``) in strict compliance of the JSON specification, instead of
 | 
				
			||||||
   using the JavaScript equivalents (``NaN``, ``Infinity``, ``-Infinity``).
 | 
					   using the JavaScript equivalents (``NaN``, ``Infinity``, ``-Infinity``).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   If *indent* is a non-negative integer, then JSON array elements and object
 | 
					   If *indent* is a non-negative integer or string, then JSON array elements and
 | 
				
			||||||
   members will be pretty-printed with that indent level.  An indent level of 0
 | 
					   object members will be pretty-printed with that indent level.  An indent level
 | 
				
			||||||
   will only insert newlines.  ``None`` (the default) selects the most compact
 | 
					   of 0 or ``""`` will only insert newlines.  ``None`` (the default) selects the
 | 
				
			||||||
   representation.
 | 
					   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
 | 
					   If *separators* is an ``(item_separator, dict_separator)`` tuple, then it
 | 
				
			||||||
   will be used instead of the default ``(', ', ': ')`` separators.  ``(',',
 | 
					   will be used instead of the default ``(', ', ': ')`` separators.  ``(',',
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -259,6 +259,9 @@ def _make_iterencode(markers, _default, _encoder, _indent, _floatstr,
 | 
				
			||||||
        tuple=tuple,
 | 
					        tuple=tuple,
 | 
				
			||||||
    ):
 | 
					    ):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if _indent is not None and not isinstance(_indent, str):
 | 
				
			||||||
 | 
					        _indent = ' ' * _indent
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def _iterencode_list(lst, _current_indent_level):
 | 
					    def _iterencode_list(lst, _current_indent_level):
 | 
				
			||||||
        if not lst:
 | 
					        if not lst:
 | 
				
			||||||
            yield '[]'
 | 
					            yield '[]'
 | 
				
			||||||
| 
						 | 
					@ -271,7 +274,7 @@ def _iterencode_list(lst, _current_indent_level):
 | 
				
			||||||
        buf = '['
 | 
					        buf = '['
 | 
				
			||||||
        if _indent is not None:
 | 
					        if _indent is not None:
 | 
				
			||||||
            _current_indent_level += 1
 | 
					            _current_indent_level += 1
 | 
				
			||||||
            newline_indent = '\n' + (' ' * (_indent * _current_indent_level))
 | 
					            newline_indent = '\n' + _indent * _current_indent_level
 | 
				
			||||||
            separator = _item_separator + newline_indent
 | 
					            separator = _item_separator + newline_indent
 | 
				
			||||||
            buf += newline_indent
 | 
					            buf += newline_indent
 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
| 
						 | 
					@ -307,7 +310,7 @@ def _iterencode_list(lst, _current_indent_level):
 | 
				
			||||||
                    yield chunk
 | 
					                    yield chunk
 | 
				
			||||||
        if newline_indent is not None:
 | 
					        if newline_indent is not None:
 | 
				
			||||||
            _current_indent_level -= 1
 | 
					            _current_indent_level -= 1
 | 
				
			||||||
            yield '\n' + (' ' * (_indent * _current_indent_level))
 | 
					            yield '\n' + _indent * _current_indent_level
 | 
				
			||||||
        yield ']'
 | 
					        yield ']'
 | 
				
			||||||
        if markers is not None:
 | 
					        if markers is not None:
 | 
				
			||||||
            del markers[markerid]
 | 
					            del markers[markerid]
 | 
				
			||||||
| 
						 | 
					@ -324,7 +327,7 @@ def _iterencode_dict(dct, _current_indent_level):
 | 
				
			||||||
        yield '{'
 | 
					        yield '{'
 | 
				
			||||||
        if _indent is not None:
 | 
					        if _indent is not None:
 | 
				
			||||||
            _current_indent_level += 1
 | 
					            _current_indent_level += 1
 | 
				
			||||||
            newline_indent = '\n' + (' ' * (_indent * _current_indent_level))
 | 
					            newline_indent = '\n' + _indent * _current_indent_level
 | 
				
			||||||
            item_separator = _item_separator + newline_indent
 | 
					            item_separator = _item_separator + newline_indent
 | 
				
			||||||
            yield newline_indent
 | 
					            yield newline_indent
 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
| 
						 | 
					@ -383,7 +386,7 @@ def _iterencode_dict(dct, _current_indent_level):
 | 
				
			||||||
                    yield chunk
 | 
					                    yield chunk
 | 
				
			||||||
        if newline_indent is not None:
 | 
					        if newline_indent is not None:
 | 
				
			||||||
            _current_indent_level -= 1
 | 
					            _current_indent_level -= 1
 | 
				
			||||||
            yield '\n' + (' ' * (_indent * _current_indent_level))
 | 
					            yield '\n' + _indent * _current_indent_level
 | 
				
			||||||
        yield '}'
 | 
					        yield '}'
 | 
				
			||||||
        if markers is not None:
 | 
					        if markers is not None:
 | 
				
			||||||
            del markers[markerid]
 | 
					            del markers[markerid]
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -10,32 +10,36 @@ def test_indent(self):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        expect = textwrap.dedent("""\
 | 
					        expect = textwrap.dedent("""\
 | 
				
			||||||
        [
 | 
					        [
 | 
				
			||||||
          [
 | 
					        \t[
 | 
				
			||||||
            "blorpie"
 | 
					        \t\t"blorpie"
 | 
				
			||||||
          ],
 | 
					        \t],
 | 
				
			||||||
          [
 | 
					        \t[
 | 
				
			||||||
            "whoops"
 | 
					        \t\t"whoops"
 | 
				
			||||||
          ],
 | 
					        \t],
 | 
				
			||||||
          [],
 | 
					        \t[],
 | 
				
			||||||
          "d-shtaeou",
 | 
					        \t"d-shtaeou",
 | 
				
			||||||
          "d-nthiouh",
 | 
					        \t"d-nthiouh",
 | 
				
			||||||
          "i-vhbjkhnth",
 | 
					        \t"i-vhbjkhnth",
 | 
				
			||||||
          {
 | 
					        \t{
 | 
				
			||||||
            "nifty": 87
 | 
					        \t\t"nifty": 87
 | 
				
			||||||
          },
 | 
					        \t},
 | 
				
			||||||
          {
 | 
					        \t{
 | 
				
			||||||
            "field": "yes",
 | 
					        \t\t"field": "yes",
 | 
				
			||||||
            "morefield": false
 | 
					        \t\t"morefield": false
 | 
				
			||||||
          }
 | 
					        \t}
 | 
				
			||||||
        ]""")
 | 
					        ]""")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        d1 = json.dumps(h)
 | 
					        d1 = json.dumps(h)
 | 
				
			||||||
        d2 = json.dumps(h, indent=2, sort_keys=True, separators=(',', ': '))
 | 
					        d2 = json.dumps(h, indent=2, sort_keys=True, separators=(',', ': '))
 | 
				
			||||||
 | 
					        d3 = json.dumps(h, indent='\t', sort_keys=True, separators=(',', ': '))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        h1 = json.loads(d1)
 | 
					        h1 = json.loads(d1)
 | 
				
			||||||
        h2 = json.loads(d2)
 | 
					        h2 = json.loads(d2)
 | 
				
			||||||
 | 
					        h3 = json.loads(d3)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.assertEquals(h1, h)
 | 
					        self.assertEquals(h1, h)
 | 
				
			||||||
        self.assertEquals(h2, h)
 | 
					        self.assertEquals(h2, h)
 | 
				
			||||||
        self.assertEquals(d2, expect)
 | 
					        self.assertEquals(h3, h)
 | 
				
			||||||
 | 
					        self.assertEquals(d2, expect.expandtabs(2))
 | 
				
			||||||
 | 
					        self.assertEquals(d3, expect)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -59,6 +59,9 @@ Core and Builtins
 | 
				
			||||||
Library
 | 
					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
 | 
					- Issue #10253: FileIO leaks a file descriptor when trying to open a file
 | 
				
			||||||
  for append that isn't seekable.  Patch by Brian Brazil.
 | 
					  for append that isn't seekable.  Patch by Brian Brazil.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue