[apparmor] [patch] common.py: add recursive_print()

Christian Boltz apparmor at cboltz.de
Fri Feb 28 18:37:43 UTC 2014


Hello,

Am Donnerstag, 27. Februar 2014 schrieb Kshitij Gupta:
> On Feb 27, 2014 6:18 AM, "Christian Boltz" <apparmor at cboltz.de> wrote:
> > this patch adds recursive_print() to common.py.
> > 
> > It prints a data structure in an easily readable output and is quite
> 
> Works with nested dictionaries, lists, strings, numbers, sets.
> Err it doesnt work with tuples. Gives a nice trace:
> 
> Traceback (most recent call last):
>   File "<pyshell#3>", line 1, in <module>
>     recursive_print(a)
>   File "<pyshell#1>", line 24, in recursive_print
>     print (tabs(dpth) + '- %s' % src)
> TypeError: not all arguments converted during string formatting

Nice. Looks like I didn't hit a tuple while debugging ;-)

> > +    elif isinstance(src, list):
> Matter can be fixed by changing the above line to:
> elif isinstance(src, list) or isinstance(src, tuple):
> 
> Given we agree that the same style works for both lists and tuples and
> we dont want people to know its a tuple (list is mutable and tuple
> immutable).

This is meant as a debugging aid to show the content of $something.
Before modifying some variables / hashers / lists / tuples / whatever, 
you should have a look at the existing code, which will also show you if 
something is a list or a tuple.

So I'd say we can handle list and tuple in the same code for now.
If someone really needs to see the type, we can always split the if 
condition - but for now it's easier to handle it in the same code.

> Nacked in present state. I hope thats fine?

Yes, of course. Feedback to improve code is always fine ;-)

> Can please look into the suggested change and resend the patch? :-)

I didn't hear anything from Jamie to defend pprint after my last mail ;-)
so here's v2 (with the "or isinstance(src, tuple)" part added):

=== modified file 'utils/apparmor/common.py'
--- utils/apparmor/common.py    2014-02-24 19:34:21 +0000
+++ utils/apparmor/common.py    2014-02-28 18:27:39 +0000
@@ -71,6 +71,38 @@
         except IOError:
             pass
 
+def recursive_print(src, dpth = 0, key = ''):
+    # print recursively in a nicely formatted way
+    # useful for debugging, too verbose for production code ;-)
+
+    # "stolen" from http://code.activestate.com/recipes/578094-recursively-print-nested-dictionaries/
+    # by Scott S-Allen / MIT License
+    # (output format slightly modified)
+    """ Recursively prints nested elements."""
+    tabs = lambda n: ' ' * n * 4  # or 2 or 8 or...
+    brace = lambda s, n: '[%s]' % (s)
+
+    if isinstance(src, dict):
+        empty = True
+        for key, value in src.iteritems():
+            print (tabs(dpth) + brace(key, dpth))
+            recursive_print(value, dpth + 1, key)
+            empty = False
+        if empty:
+            print (tabs(dpth) + '[--- empty ---]')
+    elif isinstance(src, list) or isinstance(src, tuple):
+        empty = True
+        for litem in src:
+            recursive_print(litem, dpth + 2)
+            empty = False
+        if empty:
+            print (tabs(dpth) + '[--- empty ---]')
+    else:
+        if key:
+            print (tabs(dpth) + '%s = %s' % (key, src))                                                                                                     
+        else:                                                                                                                                               
+            print (tabs(dpth) + '- %s' % src)                                                                                                               
+
 def cmd(command):
     '''Try to execute the given command.'''
     debug(command)



Regards,

Christian Boltz
-- 
> oder das absolut berauschende ;-))
>   [ -d "/test/" ] || echo mkd
Danke, zum Glück muß ich heute nicht mehr mit dem Auto fahren :-)
[> Thomas Preissler und Al Bogner in suse-linux]




More information about the AppArmor mailing list