%global _empty_manifest_terminate_build 0 Name: python-Dumper Version: 1.2.0 Release: 1 Summary: Tool to conveniently describe any Python datastructure License: MIT URL: https://github.com/jric/Dumper.py Source0: https://mirrors.nju.edu.cn/pypi/web/packages/4e/0c/2b5a4e34eda55856a7adeb4e11f768d2beb190b7c2abafc3aac13dc816c9/Dumper-1.2.0.tar.gz BuildArch: noarch %description Code to dump out any Python object to text in a way that aids debugging / useful logging. Dump Python data structures (including class instances) in a nicely- nested, easy-to-read form. Handles recursive data structures properly, and has sensible options for limiting the extent of the dump both by simple depth and by some rules for how to handle contained instances. Copyright (c) 2009 Python Software Foundation Copyright (c) 2014 Joshua Richardson, Chegg Inc. Dumping is generally accessed through the 'dump()' function: dump (any_python_object) and is controlled by setting module-level global variables: import dumper dumper.max_depth = 10 # default is 5 dumper.dump (really_deep_object) 'dump()' is nearly equivalent to 'print' with backquotes for non-aggregate values (ie. anything *except* lists, tuples, dictionaries, and class instances). That is, strings, integers, floats, and other numeric types are printed out "as-is", and funkier things like class objects, function objects, and type objects are also dumped using their traditional Python string representation. For example: >>> dump ("Hello" + "world") 'Helloworld' >>> class Foo: pass >>> dump (Foo) 'dump()' is slightly more interesting than 'print' for "short" lists, tuples, and dictionaries. (Lists and tuples are "short" when they have no more than 10 elements and all elements are strings or numbers; dictionaries are short when they have no more than 5 key/value pairs and all keys and values are strings or numbers.) For "short" lists and tuples, you get the 'id()' of the object and its contents on one line: >>> dump (['foo', 3]) ['foo', 3] >>> dump ((3+4j, 'blah', 2L**50)) ((3+4j), 'blah', 1125899906842624L) "Short" dictionaries are similar: >>> d = {'foo': 5, 'bar': 3, 'bonk': 4-3j} >>> dump (d) {'foo': 5, 'bonk': (4-3j), 'bar': 3} 'dump()' is considerably more interesting than 'print' for lists, tuples, and dictionaries that include more complex objects or are longer than the 10-element/5-pair limit. A long but simple list: >>> f = open ('/usr/dict/words') >>> dump (f.readlines()) 0: '10th\012' 1: '1st\012' 2: '2nd\012' 25138: 'zounds\012' 25139: "z's\012" 25140: 'zucchini\012' 25141: 'Zurich\012' 25142: 'zygote\012' (Ellipsis added: 'dump()' just dumps the whole thing.) Nested lists also get multiline formatting, no matter how short and simple: >>> dump (['nested', ['list']]) 0: 'nested' 1: ['list'] Note that since the inner list is "short" it is formatted on one line. Deeply nested lists and tuples are more fun: >>> l = ["top", ('tuple', 'depth', 1), >>> dump (l) 0: 'top' 1: ('tuple', 'depth', 1) 2: 'top again' 3: 0: 'level 1' 1: 0: 'level' 1: 2 2: ('deep', 'tuple') Obviously, this is very handy for debugging complicated data structures. Recursive data structures are not a problem: >>> l = [1, 2, 3] >>> l.append (l) >>> dump (l) 0: 1 1: 2 2: 3 3: : already seen which is bulkier, but somewhat more informative than "[1, 2, 3, [...]]". Dictionaries with aggregate keys or values also get multiline displays: >>> dump ({(1,0): 'keys', (0,1): 'fun'}) (0, 1): 'fun' (1, 0): 'keys' Note that when dictionaries are dumped in multiline format, they are sorted by key. In single-line format, 'dump()' just uses 'repr()', so "short" dictionaries come out in hash order. Also, no matter how complicated dictionary *keys* are, they come out all on one line before the colon. (Using deeply nested dictionary keys requires a special kind of madness, though, so you probably know what you're doing if you're into that.) Dictionary *values* are treated much like list/tuple elements (one line if short, indented multiline display if not). 'dump()' is *much* more interesting than 'print' for class instances. Simple example: >>> class Foo: >>> f = Foo () >>> dump (f) a: 37 b: None c: : already seen A more interesting example using a contained instance and more recursion: >>> g = Foo () >>> g.a = 42; g.b = [3, 5, 6, f] >>> dump (g) a: 42 b: 0: 3 1: 5 2: 6 3: a: 37 b: None c: : already seen c: : already seen Dumping a large instance that contains several other large instance gets out of control pretty quickly. 'dump()' has a couple of options to help you get a handle on this; normally, these are set by assigning to module globals, but there's a nicer OO way of doing it if you like. For example, if you don't want 'dump()' to descend more than 3 levels into your nested data structure: >>> import dumper >>> dumper.max_depth = 3 >>> dumper.dump ([0, [1, [2, [3, [4]]]]]) 0: 0 1: 0: 1 1: 0: 2 1: : suppressed (too deep) But note that max_depth does not apply to "short" lists (or tuples or dictionaries): >>> dumper.dump ([0, [1, [2, [3, '3b', '3c']]]]) 0: 0 1: 0: 1 1: 0: 2 1: [3, '3b', '3c'] Since "short" lists (etc.) can't contain other aggregate objects, this only bends the "max_depth" limit by one level, though, and it doesn't increase the amount of output (but it does increase the amount of useful information in the dump). 'max_depth' is a pretty blunt tool, though; as soon as you set it to N, you'll find a structure of depth N+1 that you want to see all of. And anyways, dumps usually get out of control as a result of dumping large contained class instances: hence, the more useful control is to tell 'dump()' when to dump contained instances. The default is to dump contained instances when the two classes (that of the parent and that of the child) are from the same module. This applies to classes defined in the main module or an interactive session as well, hence: >>> class Foo: pass >>> class Bar: pass >>> f = Foo() ; b = Bar () >>> f.b = b >>> f.a = 37 >>> b.a = 42 >>> dumper.dump (f) a: 37 b: a: 42 Note that we have dumped f.b, the contained instance of Bar. We can control dumping of contained instances using the 'instance_dump' global; for example, to completely disable dumping contained instances, set it to 'none': >>> dumper.instance_dump = 'none' >>> dumper.dump (f) a: 37 b: : suppressed (contained instance) This is the most restrictive mode for contained instance dumping. The default mode is 'module', meaning that 'dump()' will only dump contained instances if both classes (parent and child) were defined in the same module. If the two classes were defined in different modules, e.g. >>> from foo import Foo >>> from bar import Bar >>> f = Foo () ; f.a = 42 >>> b = Bar () ; b.s = "hello" >>> f.child = b then dumping the container ('f') results in something like >>> dumper.dump (f) a: 42 child: : suppressed (contained instance from different module) Of course, you can always explicitly dump the contained instance: >>> dumper.dump (f.child) s: 'hello' The next most permissive level is to dump contained instances as long as their respective classes were defined in the same package. Continuing the above example: >>> dumper.instance_dump = 'package' >>> dumper.dump (f) a: 42 child: s: 'hello' But if the Foo and Bar classes had come from modules in different packages, then dumping 'f' would look like: >>> dumper.dump (f) a: 42 child: : suppressed (contained instance from different package) Only if you set 'instance_dump' to its most permissive setting, 'all', will 'dump()' dump contained instances of classes in completely different packages: >>> dumper.instance_dump = 'all' >>> dumper.dump (f) a: 42 child: %package -n python3-Dumper Summary: Tool to conveniently describe any Python datastructure Provides: python-Dumper BuildRequires: python3-devel BuildRequires: python3-setuptools BuildRequires: python3-pip %description -n python3-Dumper Code to dump out any Python object to text in a way that aids debugging / useful logging. Dump Python data structures (including class instances) in a nicely- nested, easy-to-read form. Handles recursive data structures properly, and has sensible options for limiting the extent of the dump both by simple depth and by some rules for how to handle contained instances. Copyright (c) 2009 Python Software Foundation Copyright (c) 2014 Joshua Richardson, Chegg Inc. Dumping is generally accessed through the 'dump()' function: dump (any_python_object) and is controlled by setting module-level global variables: import dumper dumper.max_depth = 10 # default is 5 dumper.dump (really_deep_object) 'dump()' is nearly equivalent to 'print' with backquotes for non-aggregate values (ie. anything *except* lists, tuples, dictionaries, and class instances). That is, strings, integers, floats, and other numeric types are printed out "as-is", and funkier things like class objects, function objects, and type objects are also dumped using their traditional Python string representation. For example: >>> dump ("Hello" + "world") 'Helloworld' >>> class Foo: pass >>> dump (Foo) 'dump()' is slightly more interesting than 'print' for "short" lists, tuples, and dictionaries. (Lists and tuples are "short" when they have no more than 10 elements and all elements are strings or numbers; dictionaries are short when they have no more than 5 key/value pairs and all keys and values are strings or numbers.) For "short" lists and tuples, you get the 'id()' of the object and its contents on one line: >>> dump (['foo', 3]) ['foo', 3] >>> dump ((3+4j, 'blah', 2L**50)) ((3+4j), 'blah', 1125899906842624L) "Short" dictionaries are similar: >>> d = {'foo': 5, 'bar': 3, 'bonk': 4-3j} >>> dump (d) {'foo': 5, 'bonk': (4-3j), 'bar': 3} 'dump()' is considerably more interesting than 'print' for lists, tuples, and dictionaries that include more complex objects or are longer than the 10-element/5-pair limit. A long but simple list: >>> f = open ('/usr/dict/words') >>> dump (f.readlines()) 0: '10th\012' 1: '1st\012' 2: '2nd\012' 25138: 'zounds\012' 25139: "z's\012" 25140: 'zucchini\012' 25141: 'Zurich\012' 25142: 'zygote\012' (Ellipsis added: 'dump()' just dumps the whole thing.) Nested lists also get multiline formatting, no matter how short and simple: >>> dump (['nested', ['list']]) 0: 'nested' 1: ['list'] Note that since the inner list is "short" it is formatted on one line. Deeply nested lists and tuples are more fun: >>> l = ["top", ('tuple', 'depth', 1), >>> dump (l) 0: 'top' 1: ('tuple', 'depth', 1) 2: 'top again' 3: 0: 'level 1' 1: 0: 'level' 1: 2 2: ('deep', 'tuple') Obviously, this is very handy for debugging complicated data structures. Recursive data structures are not a problem: >>> l = [1, 2, 3] >>> l.append (l) >>> dump (l) 0: 1 1: 2 2: 3 3: : already seen which is bulkier, but somewhat more informative than "[1, 2, 3, [...]]". Dictionaries with aggregate keys or values also get multiline displays: >>> dump ({(1,0): 'keys', (0,1): 'fun'}) (0, 1): 'fun' (1, 0): 'keys' Note that when dictionaries are dumped in multiline format, they are sorted by key. In single-line format, 'dump()' just uses 'repr()', so "short" dictionaries come out in hash order. Also, no matter how complicated dictionary *keys* are, they come out all on one line before the colon. (Using deeply nested dictionary keys requires a special kind of madness, though, so you probably know what you're doing if you're into that.) Dictionary *values* are treated much like list/tuple elements (one line if short, indented multiline display if not). 'dump()' is *much* more interesting than 'print' for class instances. Simple example: >>> class Foo: >>> f = Foo () >>> dump (f) a: 37 b: None c: : already seen A more interesting example using a contained instance and more recursion: >>> g = Foo () >>> g.a = 42; g.b = [3, 5, 6, f] >>> dump (g) a: 42 b: 0: 3 1: 5 2: 6 3: a: 37 b: None c: : already seen c: : already seen Dumping a large instance that contains several other large instance gets out of control pretty quickly. 'dump()' has a couple of options to help you get a handle on this; normally, these are set by assigning to module globals, but there's a nicer OO way of doing it if you like. For example, if you don't want 'dump()' to descend more than 3 levels into your nested data structure: >>> import dumper >>> dumper.max_depth = 3 >>> dumper.dump ([0, [1, [2, [3, [4]]]]]) 0: 0 1: 0: 1 1: 0: 2 1: : suppressed (too deep) But note that max_depth does not apply to "short" lists (or tuples or dictionaries): >>> dumper.dump ([0, [1, [2, [3, '3b', '3c']]]]) 0: 0 1: 0: 1 1: 0: 2 1: [3, '3b', '3c'] Since "short" lists (etc.) can't contain other aggregate objects, this only bends the "max_depth" limit by one level, though, and it doesn't increase the amount of output (but it does increase the amount of useful information in the dump). 'max_depth' is a pretty blunt tool, though; as soon as you set it to N, you'll find a structure of depth N+1 that you want to see all of. And anyways, dumps usually get out of control as a result of dumping large contained class instances: hence, the more useful control is to tell 'dump()' when to dump contained instances. The default is to dump contained instances when the two classes (that of the parent and that of the child) are from the same module. This applies to classes defined in the main module or an interactive session as well, hence: >>> class Foo: pass >>> class Bar: pass >>> f = Foo() ; b = Bar () >>> f.b = b >>> f.a = 37 >>> b.a = 42 >>> dumper.dump (f) a: 37 b: a: 42 Note that we have dumped f.b, the contained instance of Bar. We can control dumping of contained instances using the 'instance_dump' global; for example, to completely disable dumping contained instances, set it to 'none': >>> dumper.instance_dump = 'none' >>> dumper.dump (f) a: 37 b: : suppressed (contained instance) This is the most restrictive mode for contained instance dumping. The default mode is 'module', meaning that 'dump()' will only dump contained instances if both classes (parent and child) were defined in the same module. If the two classes were defined in different modules, e.g. >>> from foo import Foo >>> from bar import Bar >>> f = Foo () ; f.a = 42 >>> b = Bar () ; b.s = "hello" >>> f.child = b then dumping the container ('f') results in something like >>> dumper.dump (f) a: 42 child: : suppressed (contained instance from different module) Of course, you can always explicitly dump the contained instance: >>> dumper.dump (f.child) s: 'hello' The next most permissive level is to dump contained instances as long as their respective classes were defined in the same package. Continuing the above example: >>> dumper.instance_dump = 'package' >>> dumper.dump (f) a: 42 child: s: 'hello' But if the Foo and Bar classes had come from modules in different packages, then dumping 'f' would look like: >>> dumper.dump (f) a: 42 child: : suppressed (contained instance from different package) Only if you set 'instance_dump' to its most permissive setting, 'all', will 'dump()' dump contained instances of classes in completely different packages: >>> dumper.instance_dump = 'all' >>> dumper.dump (f) a: 42 child: %package help Summary: Development documents and examples for Dumper Provides: python3-Dumper-doc %description help Code to dump out any Python object to text in a way that aids debugging / useful logging. Dump Python data structures (including class instances) in a nicely- nested, easy-to-read form. Handles recursive data structures properly, and has sensible options for limiting the extent of the dump both by simple depth and by some rules for how to handle contained instances. Copyright (c) 2009 Python Software Foundation Copyright (c) 2014 Joshua Richardson, Chegg Inc. Dumping is generally accessed through the 'dump()' function: dump (any_python_object) and is controlled by setting module-level global variables: import dumper dumper.max_depth = 10 # default is 5 dumper.dump (really_deep_object) 'dump()' is nearly equivalent to 'print' with backquotes for non-aggregate values (ie. anything *except* lists, tuples, dictionaries, and class instances). That is, strings, integers, floats, and other numeric types are printed out "as-is", and funkier things like class objects, function objects, and type objects are also dumped using their traditional Python string representation. For example: >>> dump ("Hello" + "world") 'Helloworld' >>> class Foo: pass >>> dump (Foo) 'dump()' is slightly more interesting than 'print' for "short" lists, tuples, and dictionaries. (Lists and tuples are "short" when they have no more than 10 elements and all elements are strings or numbers; dictionaries are short when they have no more than 5 key/value pairs and all keys and values are strings or numbers.) For "short" lists and tuples, you get the 'id()' of the object and its contents on one line: >>> dump (['foo', 3]) ['foo', 3] >>> dump ((3+4j, 'blah', 2L**50)) ((3+4j), 'blah', 1125899906842624L) "Short" dictionaries are similar: >>> d = {'foo': 5, 'bar': 3, 'bonk': 4-3j} >>> dump (d) {'foo': 5, 'bonk': (4-3j), 'bar': 3} 'dump()' is considerably more interesting than 'print' for lists, tuples, and dictionaries that include more complex objects or are longer than the 10-element/5-pair limit. A long but simple list: >>> f = open ('/usr/dict/words') >>> dump (f.readlines()) 0: '10th\012' 1: '1st\012' 2: '2nd\012' 25138: 'zounds\012' 25139: "z's\012" 25140: 'zucchini\012' 25141: 'Zurich\012' 25142: 'zygote\012' (Ellipsis added: 'dump()' just dumps the whole thing.) Nested lists also get multiline formatting, no matter how short and simple: >>> dump (['nested', ['list']]) 0: 'nested' 1: ['list'] Note that since the inner list is "short" it is formatted on one line. Deeply nested lists and tuples are more fun: >>> l = ["top", ('tuple', 'depth', 1), >>> dump (l) 0: 'top' 1: ('tuple', 'depth', 1) 2: 'top again' 3: 0: 'level 1' 1: 0: 'level' 1: 2 2: ('deep', 'tuple') Obviously, this is very handy for debugging complicated data structures. Recursive data structures are not a problem: >>> l = [1, 2, 3] >>> l.append (l) >>> dump (l) 0: 1 1: 2 2: 3 3: : already seen which is bulkier, but somewhat more informative than "[1, 2, 3, [...]]". Dictionaries with aggregate keys or values also get multiline displays: >>> dump ({(1,0): 'keys', (0,1): 'fun'}) (0, 1): 'fun' (1, 0): 'keys' Note that when dictionaries are dumped in multiline format, they are sorted by key. In single-line format, 'dump()' just uses 'repr()', so "short" dictionaries come out in hash order. Also, no matter how complicated dictionary *keys* are, they come out all on one line before the colon. (Using deeply nested dictionary keys requires a special kind of madness, though, so you probably know what you're doing if you're into that.) Dictionary *values* are treated much like list/tuple elements (one line if short, indented multiline display if not). 'dump()' is *much* more interesting than 'print' for class instances. Simple example: >>> class Foo: >>> f = Foo () >>> dump (f) a: 37 b: None c: : already seen A more interesting example using a contained instance and more recursion: >>> g = Foo () >>> g.a = 42; g.b = [3, 5, 6, f] >>> dump (g) a: 42 b: 0: 3 1: 5 2: 6 3: a: 37 b: None c: : already seen c: : already seen Dumping a large instance that contains several other large instance gets out of control pretty quickly. 'dump()' has a couple of options to help you get a handle on this; normally, these are set by assigning to module globals, but there's a nicer OO way of doing it if you like. For example, if you don't want 'dump()' to descend more than 3 levels into your nested data structure: >>> import dumper >>> dumper.max_depth = 3 >>> dumper.dump ([0, [1, [2, [3, [4]]]]]) 0: 0 1: 0: 1 1: 0: 2 1: : suppressed (too deep) But note that max_depth does not apply to "short" lists (or tuples or dictionaries): >>> dumper.dump ([0, [1, [2, [3, '3b', '3c']]]]) 0: 0 1: 0: 1 1: 0: 2 1: [3, '3b', '3c'] Since "short" lists (etc.) can't contain other aggregate objects, this only bends the "max_depth" limit by one level, though, and it doesn't increase the amount of output (but it does increase the amount of useful information in the dump). 'max_depth' is a pretty blunt tool, though; as soon as you set it to N, you'll find a structure of depth N+1 that you want to see all of. And anyways, dumps usually get out of control as a result of dumping large contained class instances: hence, the more useful control is to tell 'dump()' when to dump contained instances. The default is to dump contained instances when the two classes (that of the parent and that of the child) are from the same module. This applies to classes defined in the main module or an interactive session as well, hence: >>> class Foo: pass >>> class Bar: pass >>> f = Foo() ; b = Bar () >>> f.b = b >>> f.a = 37 >>> b.a = 42 >>> dumper.dump (f) a: 37 b: a: 42 Note that we have dumped f.b, the contained instance of Bar. We can control dumping of contained instances using the 'instance_dump' global; for example, to completely disable dumping contained instances, set it to 'none': >>> dumper.instance_dump = 'none' >>> dumper.dump (f) a: 37 b: : suppressed (contained instance) This is the most restrictive mode for contained instance dumping. The default mode is 'module', meaning that 'dump()' will only dump contained instances if both classes (parent and child) were defined in the same module. If the two classes were defined in different modules, e.g. >>> from foo import Foo >>> from bar import Bar >>> f = Foo () ; f.a = 42 >>> b = Bar () ; b.s = "hello" >>> f.child = b then dumping the container ('f') results in something like >>> dumper.dump (f) a: 42 child: : suppressed (contained instance from different module) Of course, you can always explicitly dump the contained instance: >>> dumper.dump (f.child) s: 'hello' The next most permissive level is to dump contained instances as long as their respective classes were defined in the same package. Continuing the above example: >>> dumper.instance_dump = 'package' >>> dumper.dump (f) a: 42 child: s: 'hello' But if the Foo and Bar classes had come from modules in different packages, then dumping 'f' would look like: >>> dumper.dump (f) a: 42 child: : suppressed (contained instance from different package) Only if you set 'instance_dump' to its most permissive setting, 'all', will 'dump()' dump contained instances of classes in completely different packages: >>> dumper.instance_dump = 'all' >>> dumper.dump (f) a: 42 child: %prep %autosetup -n Dumper-1.2.0 %build %py3_build %install %py3_install install -d -m755 %{buildroot}/%{_pkgdocdir} if [ -d doc ]; then cp -arf doc %{buildroot}/%{_pkgdocdir}; fi if [ -d docs ]; then cp -arf docs %{buildroot}/%{_pkgdocdir}; fi if [ -d example ]; then cp -arf example %{buildroot}/%{_pkgdocdir}; fi if [ -d examples ]; then cp -arf examples %{buildroot}/%{_pkgdocdir}; fi pushd %{buildroot} if [ -d usr/lib ]; then find usr/lib -type f -printf "/%h/%f\n" >> filelist.lst fi if [ -d usr/lib64 ]; then find usr/lib64 -type f -printf "/%h/%f\n" >> filelist.lst fi if [ -d usr/bin ]; then find usr/bin -type f -printf "/%h/%f\n" >> filelist.lst fi if [ -d usr/sbin ]; then find usr/sbin -type f -printf "/%h/%f\n" >> filelist.lst fi touch doclist.lst if [ -d usr/share/man ]; then find usr/share/man -type f -printf "/%h/%f.gz\n" >> doclist.lst fi popd mv %{buildroot}/filelist.lst . mv %{buildroot}/doclist.lst . %files -n python3-Dumper -f filelist.lst %dir %{python3_sitelib}/* %files help -f doclist.lst %{_docdir}/* %changelog * Tue Apr 25 2023 Python_Bot - 1.2.0-1 - Package Spec generated