diff --git a/IPython/core/formatters.py b/IPython/core/formatters.py index b88721e..6d1d12b 100644 --- a/IPython/core/formatters.py +++ b/IPython/core/formatters.py @@ -589,7 +589,14 @@ class PlainTextFormatter(BaseFormatter): # This subclass ignores this attribute as it always need to return # something. enabled = Bool(True, config=False) - + + max_seq_length = Integer(pretty.MAX_SEQ_LENGTH, config=True, + help="""Truncate large collections (lists, dicts, tuples, sets) to this size. + + Set to 0 to disable truncation. + """ + ) + # Look for a _repr_pretty_ methods to use for pretty printing. print_method = ObjectName('_repr_pretty_') @@ -682,6 +689,7 @@ class PlainTextFormatter(BaseFormatter): # or it will cause trouble. printer = pretty.RepresentationPrinter(stream, self.verbose, self.max_width, unicode_to_str(self.newline), + max_seq_length=self.max_seq_length, singleton_pprinters=self.singleton_printers, type_pprinters=self.type_printers, deferred_pprinters=self.deferred_printers) diff --git a/IPython/core/tests/test_formatters.py b/IPython/core/tests/test_formatters.py index de3cac5..1c511ea 100644 --- a/IPython/core/tests/test_formatters.py +++ b/IPython/core/tests/test_formatters.py @@ -338,3 +338,15 @@ def test_format_config(): result = f(Config) nt.assert_is(result, None) nt.assert_equal(captured.stderr, "") + +def test_pretty_max_seq_length(): + f = PlainTextFormatter(max_seq_length=1) + lis = list(range(3)) + text = f(lis) + nt.assert_equal(text, '[0, ...]') + f.max_seq_length = 0 + text = f(lis) + nt.assert_equal(text, '[0, 1, 2]') + text = f(list(range(1024))) + lines = text.splitlines() + nt.assert_equal(len(lines), 1024) diff --git a/IPython/lib/pretty.py b/IPython/lib/pretty.py index b04d95a..db39afa 100644 --- a/IPython/lib/pretty.py +++ b/IPython/lib/pretty.py @@ -123,9 +123,9 @@ __all__ = ['pretty', 'pprint', 'PrettyPrinter', 'RepresentationPrinter', 'for_type', 'for_type_by_name'] +MAX_SEQ_LENGTH = 1000 _re_pattern_type = type(re.compile('')) - def _safe_getattr(obj, attr, default=None): """Safe version of getattr. @@ -137,22 +137,22 @@ def _safe_getattr(obj, attr, default=None): except Exception: return default -def pretty(obj, verbose=False, max_width=79, newline='\n'): +def pretty(obj, verbose=False, max_width=79, newline='\n', max_seq_length=MAX_SEQ_LENGTH): """ Pretty print the object's representation. """ stream = StringIO() - printer = RepresentationPrinter(stream, verbose, max_width, newline) + printer = RepresentationPrinter(stream, verbose, max_width, newline, max_seq_length) printer.pretty(obj) printer.flush() return stream.getvalue() -def pprint(obj, verbose=False, max_width=79, newline='\n'): +def pprint(obj, verbose=False, max_width=79, newline='\n', max_seq_length=MAX_SEQ_LENGTH): """ Like `pretty` but print to stdout. """ - printer = RepresentationPrinter(sys.stdout, verbose, max_width, newline) + printer = RepresentationPrinter(sys.stdout, verbose, max_width, newline, max_seq_length) printer.pretty(obj) printer.flush() sys.stdout.write(newline) @@ -186,7 +186,7 @@ class PrettyPrinter(_PrettyPrinterBase): callback method. """ - def __init__(self, output, max_width=79, newline='\n', max_seq_length=1000): + def __init__(self, output, max_width=79, newline='\n', max_seq_length=MAX_SEQ_LENGTH): self.output = output self.max_width = max_width self.newline = newline @@ -346,9 +346,10 @@ class RepresentationPrinter(PrettyPrinter): """ def __init__(self, output, verbose=False, max_width=79, newline='\n', - singleton_pprinters=None, type_pprinters=None, deferred_pprinters=None): + singleton_pprinters=None, type_pprinters=None, deferred_pprinters=None, + max_seq_length=MAX_SEQ_LENGTH): - PrettyPrinter.__init__(self, output, max_width, newline) + PrettyPrinter.__init__(self, output, max_width, newline, max_seq_length=max_seq_length) self.verbose = verbose self.stack = [] if singleton_pprinters is None: