{"id":1417,"date":"2021-12-31T16:47:49","date_gmt":"2021-12-31T16:47:49","guid":{"rendered":"https:\/\/salarydistribution.com\/machine-learning\/2021\/12\/31\/understanding-traceback-in-python\/"},"modified":"2021-12-31T16:47:49","modified_gmt":"2021-12-31T16:47:49","slug":"understanding-traceback-in-python","status":"publish","type":"post","link":"https:\/\/salarydistribution.com\/machine-learning\/2021\/12\/31\/understanding-traceback-in-python\/","title":{"rendered":"Understanding Traceback in Python"},"content":{"rendered":"<div id=\"\">\n<p id=\"last-modified-info\">Last Updated on December 24, 2021<\/p>\n<p>When an exception occurs in a Python program, often a traceback will be printed. Knowing how to read the traceback can help you easily identify the error and make a fix. In this tutorial we are going see what the traceback can tell you.<\/p>\n<p>After completing this tutorial, you will know:<\/p>\n<ul>\n<li>How to read a traceback<\/li>\n<li>How to print the call stack without exception<\/li>\n<li>What is not shown in the traceback<\/li>\n<\/ul>\n<p>Let\u2019s get started.<\/p>\n<div id=\"attachment_13149\" class=\"wp-caption aligncenter\"><img aria-describedby=\"caption-attachment-13149\" class=\"size-full wp-image-13149\" data-cfsrc=\"https:\/\/machinelearningmastery.com\/wp-content\/uploads\/2021\/12\/marten-bjork-GM9Xpgb0g98-unsplash.jpg\" alt=\"\" width=\"800\"><img decoding=\"async\" aria-describedby=\"caption-attachment-13149\" class=\"size-full wp-image-13149\" src=\"https:\/\/machinelearningmastery.com\/wp-content\/uploads\/2021\/12\/marten-bjork-GM9Xpgb0g98-unsplash.jpg\" alt=\"\" width=\"800\"><\/p>\n<p id=\"caption-attachment-13149\" class=\"wp-caption-text\">Understanding Traceback in Python<br \/>Photo by <a href=\"https:\/\/unsplash.com\/photos\/GM9Xpgb0g98\">Marten Bjork<\/a>, some rights reserved<\/p>\n<\/div>\n<h2 id=\"Tutorial-Overview\">Tutorial Overview<\/h2>\n<p>This tutorial is divided into 4 parts; they are:<\/p>\n<ol>\n<li>The call hierarchy of a simple program<\/li>\n<li>Traceback upon exception<\/li>\n<li>Triggering traceback manually<\/li>\n<li>An example in model training<\/li>\n<\/ol>\n<h2>The call hierarchy of a simple program<\/h2>\n<p>Let\u2019s consider a simple program:<\/p>\n<div id=\"urvanov-syntax-highlighter-61ce8fb480434722799157\" class=\"urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate\" data-settings=\" minimize scroll-mouseover disable-anim\">\n<p><textarea class=\"urvanov-syntax-highlighter-plain print-no\" data-settings=\"dblclick\" readonly><br \/>\ndef indentprint(x, indent=0, prefix=&#8221;&#8221;, suffix=&#8221;&#8221;):<br \/>\n    if isinstance(x, dict):<br \/>\n        printdict(x, indent, prefix, suffix)<br \/>\n    elif isinstance(x, list):<br \/>\n        printlist(x, indent, prefix, suffix)<br \/>\n    elif isinstance(x, str):<br \/>\n        printstring(x, indent, prefix, suffix)<br \/>\n    else:<br \/>\n        printnumber(x, indent, prefix, suffix)<\/p>\n<p>def printdict(x, indent, prefix, suffix):<br \/>\n    spaces = &#8221; &#8221; * indent<br \/>\n    print(spaces + prefix + &#8220;{&#8220;)<br \/>\n    for n, key in enumerate(x):<br \/>\n        comma = &#8220;,&#8221; if n!=len(x)-1 else &#8220;&#8221;<br \/>\n        indentprint(x[key], indent+2, str(key)+&#8221;: &#8220;, comma)<br \/>\n    print(spaces + &#8220;}&#8221; + suffix)<\/p>\n<p>def printlist(x, indent, prefix, suffix):<br \/>\n    spaces = &#8221; &#8221; * indent<br \/>\n    print(spaces + prefix + &#8220;[&#8220;)<br \/>\n    for n, item in enumerate(x):<br \/>\n        comma = &#8220;,&#8221; if n!=len(x)-1 else &#8220;&#8221;<br \/>\n        indentprint(item, indent+2, &#8220;&#8221;, comma)<br \/>\n    print(spaces + &#8220;]&#8221; + suffix)<\/p>\n<p>def printstring(x, indent, prefix, suffix):<br \/>\n    spaces = &#8221; &#8221; * indent<br \/>\n    print(spaces + prefix + &#8216;&#8221;&#8216; + str(x) + &#8216;&#8221;&#8216; + suffix)<\/p>\n<p>def printnumber(x, indent, prefix, suffix):<br \/>\n    spaces = &#8221; &#8221; * indent<br \/>\n    print(spaces + prefix + str(x) + suffix)<\/p>\n<p>data = {<br \/>\n    &#8220;a&#8221;: [{<br \/>\n        &#8220;p&#8221;: 3, &#8220;q&#8221;: 4,<br \/>\n        &#8220;r&#8221;: [3,4,5],<br \/>\n    },{<br \/>\n        &#8220;f&#8221;: &#8220;foo&#8221;, &#8220;g&#8221;: 2.71<br \/>\n    },{<br \/>\n        &#8220;u&#8221;: None, &#8220;v&#8221;: &#8220;bar&#8221;<br \/>\n    }],<br \/>\n    &#8220;c&#8221;: {<br \/>\n        &#8220;s&#8221;: [&#8220;fizz&#8221;, 2, 1.1],<br \/>\n        &#8220;t&#8221;: []<br \/>\n    },<br \/>\n}<\/p>\n<p>indentprint(data)<\/textarea><\/p>\n<div class=\"urvanov-syntax-highlighter-main\">\n<table class=\"crayon-table\">\n<tr class=\"urvanov-syntax-highlighter-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<div class=\"urvanov-syntax-highlighter-nums-content\">\n<p>1<\/p>\n<p>2<\/p>\n<p>3<\/p>\n<p>4<\/p>\n<p>5<\/p>\n<p>6<\/p>\n<p>7<\/p>\n<p>8<\/p>\n<p>9<\/p>\n<p>10<\/p>\n<p>11<\/p>\n<p>12<\/p>\n<p>13<\/p>\n<p>14<\/p>\n<p>15<\/p>\n<p>16<\/p>\n<p>17<\/p>\n<p>18<\/p>\n<p>19<\/p>\n<p>20<\/p>\n<p>21<\/p>\n<p>22<\/p>\n<p>23<\/p>\n<p>24<\/p>\n<p>25<\/p>\n<p>26<\/p>\n<p>27<\/p>\n<p>28<\/p>\n<p>29<\/p>\n<p>30<\/p>\n<p>31<\/p>\n<p>32<\/p>\n<p>33<\/p>\n<p>34<\/p>\n<p>35<\/p>\n<p>36<\/p>\n<p>37<\/p>\n<p>38<\/p>\n<p>39<\/p>\n<p>40<\/p>\n<p>41<\/p>\n<p>42<\/p>\n<p>43<\/p>\n<p>44<\/p>\n<p>45<\/p>\n<p>46<\/p>\n<p>47<\/p>\n<p>48<\/p>\n<p>49<\/p>\n<p>50<\/p>\n<\/div>\n<\/td>\n<td class=\"urvanov-syntax-highlighter-code\">\n<div class=\"crayon-pre\">\n<p><span class=\"crayon-e\">def <\/span><span class=\"crayon-e\">indentprint<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">x<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">indent<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-cn\">0<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">prefix<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-s\">&#8220;&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">suffix<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-s\">&#8220;&#8221;<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">if<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">isinstance<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">x<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">dict<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">printdict<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">x<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">indent<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">prefix<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">suffix<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">elif <\/span><span class=\"crayon-e\">isinstance<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">x<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">list<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">printlist<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">x<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">indent<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">prefix<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">suffix<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">elif <\/span><span class=\"crayon-e\">isinstance<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">x<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">str<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">printstring<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">x<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">indent<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">prefix<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">suffix<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">else<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">printnumber<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">x<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">indent<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">prefix<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">suffix<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-e\">def <\/span><span class=\"crayon-e\">printdict<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">x<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">indent<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">prefix<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">suffix<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">spaces<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8221; &#8220;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">*<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">indent<\/span><\/p>\n<p><span class=\"crayon-e\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">spaces<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">+<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">prefix<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">+<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;{&#8220;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">for<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">n<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">key <\/span><span class=\"crayon-st\">in<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">enumerate<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">x<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">comma<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;,&#8221;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-st\">if<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">n<\/span><span class=\"crayon-o\">!=<\/span><span class=\"crayon-e\">len<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">x<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">&#8211;<\/span><span class=\"crayon-cn\">1<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-st\">else<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;&#8221;<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">indentprint<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">x<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-v\">key<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">indent<\/span><span class=\"crayon-o\">+<\/span><span class=\"crayon-cn\">2<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">str<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">key<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">+<\/span><span class=\"crayon-s\">&#8220;: &#8220;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">comma<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">spaces<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">+<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;}&#8221;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">+<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">suffix<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-e\">def <\/span><span class=\"crayon-e\">printlist<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">x<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">indent<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">prefix<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">suffix<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">spaces<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8221; &#8220;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">*<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">indent<\/span><\/p>\n<p><span class=\"crayon-e\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">spaces<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">+<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">prefix<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">+<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;[&#8220;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">for<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">n<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">item <\/span><span class=\"crayon-st\">in<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">enumerate<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">x<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">comma<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;,&#8221;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-st\">if<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">n<\/span><span class=\"crayon-o\">!=<\/span><span class=\"crayon-e\">len<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">x<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">&#8211;<\/span><span class=\"crayon-cn\">1<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-st\">else<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;&#8221;<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">indentprint<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">item<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">indent<\/span><span class=\"crayon-o\">+<\/span><span class=\"crayon-cn\">2<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">comma<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">spaces<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">+<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;]&#8221;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">+<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">suffix<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-e\">def <\/span><span class=\"crayon-e\">printstring<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">x<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">indent<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">prefix<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">suffix<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">spaces<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8221; &#8220;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">*<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">indent<\/span><\/p>\n<p><span class=\"crayon-e\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">spaces<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">+<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">prefix<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">+<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8216;&#8221;&#8216;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">+<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">str<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">x<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">+<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8216;&#8221;&#8216;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">+<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">suffix<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-e\">def <\/span><span class=\"crayon-e\">printnumber<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">x<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">indent<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">prefix<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">suffix<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">spaces<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8221; &#8220;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">*<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">indent<\/span><\/p>\n<p><span class=\"crayon-e\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">spaces<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">+<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">prefix<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">+<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">str<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">x<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">+<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">suffix<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-v\">data<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">{<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;a&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-sy\">{<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;p&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">3<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;q&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">4<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;r&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-cn\">3<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-cn\">4<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-cn\">5<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">}<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-sy\">{<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;f&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;foo&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;g&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">2.71<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">}<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-sy\">{<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;u&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">None<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;v&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;bar&#8221;<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">}<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;c&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">{<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;s&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-s\">&#8220;fizz&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">2<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">1.1<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;t&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-sy\">]<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">}<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-sy\">}<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-e\">indentprint<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">data<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<\/div>\n<\/td>\n<\/tr>\n<\/table><\/div>\n<\/p><\/div>\n<p>This program is to print the Python dictionary <code>data<\/code> with indentations. It\u2019s output is the following:<\/p>\n<div id=\"urvanov-syntax-highlighter-61ce8fb480438081494640\" class=\"urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate\" data-settings=\" minimize scroll-mouseover disable-anim\">\n<p><textarea class=\"urvanov-syntax-highlighter-plain print-no\" data-settings=\"dblclick\" readonly><br \/>\n{<br \/>\n  a: [<br \/>\n    {<br \/>\n      p: 3,<br \/>\n      q: 4,<br \/>\n      r: [<br \/>\n        3,<br \/>\n        4,<br \/>\n        5<br \/>\n      ]<br \/>\n    },<br \/>\n    {<br \/>\n      f: &#8220;foo&#8221;,<br \/>\n      g: 2.71<br \/>\n    },<br \/>\n    {<br \/>\n      u: None,<br \/>\n      v: &#8220;bar&#8221;<br \/>\n    }<br \/>\n  ],<br \/>\n  c: {<br \/>\n    s: [<br \/>\n      &#8220;fizz&#8221;,<br \/>\n      2,<br \/>\n      1.1<br \/>\n    ],<br \/>\n    t: [<br \/>\n    ]<br \/>\n  }<br \/>\n}<\/textarea><\/p>\n<div class=\"urvanov-syntax-highlighter-main\">\n<table class=\"crayon-table\">\n<tr class=\"urvanov-syntax-highlighter-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<div class=\"urvanov-syntax-highlighter-nums-content\">\n<p>1<\/p>\n<p>2<\/p>\n<p>3<\/p>\n<p>4<\/p>\n<p>5<\/p>\n<p>6<\/p>\n<p>7<\/p>\n<p>8<\/p>\n<p>9<\/p>\n<p>10<\/p>\n<p>11<\/p>\n<p>12<\/p>\n<p>13<\/p>\n<p>14<\/p>\n<p>15<\/p>\n<p>16<\/p>\n<p>17<\/p>\n<p>18<\/p>\n<p>19<\/p>\n<p>20<\/p>\n<p>21<\/p>\n<p>22<\/p>\n<p>23<\/p>\n<p>24<\/p>\n<p>25<\/p>\n<p>26<\/p>\n<p>27<\/p>\n<p>28<\/p>\n<p>29<\/p>\n<p>30<\/p>\n<\/div>\n<\/td>\n<td class=\"urvanov-syntax-highlighter-code\">\n<div class=\"crayon-pre\">\n<p>{<\/p>\n<p>\u00a0\u00a0a: [<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0{<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0p: 3,<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0q: 4,<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0r: [<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a03,<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a04,<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a05<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0]<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0},<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0{<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0f: &#8220;foo&#8221;,<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0g: 2.71<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0},<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0{<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0u: None,<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0v: &#8220;bar&#8221;<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0}<\/p>\n<p>\u00a0\u00a0],<\/p>\n<p>\u00a0\u00a0c: {<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0s: [<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&#8220;fizz&#8221;,<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a02,<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a01.1<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0],<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0t: [<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0]<\/p>\n<p>\u00a0\u00a0}<\/p>\n<p>}<\/p>\n<\/div>\n<\/td>\n<\/tr>\n<\/table><\/div>\n<\/p><\/div>\n<p>This is a short program but functions are calling each other. If we add a line at the beginning of each function, we can reveal how the output is produced with the flow of control:<\/p>\n<div id=\"urvanov-syntax-highlighter-61ce8fb480439869906277\" class=\"urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate\" data-settings=\" minimize scroll-mouseover disable-anim\">\n<p><textarea class=\"urvanov-syntax-highlighter-plain print-no\" data-settings=\"dblclick\" readonly><br \/>\ndef indentprint(x, indent=0, prefix=&#8221;&#8221;, suffix=&#8221;&#8221;):<br \/>\n    print(f&#8217;indentprint(x, {indent}, &#8220;{prefix}&#8221;, &#8220;{suffix}&#8221;)&#8217;)<br \/>\n    if isinstance(x, dict):<br \/>\n        printdict(x, indent, prefix, suffix)<br \/>\n    elif isinstance(x, list):<br \/>\n        printlist(x, indent, prefix, suffix)<br \/>\n    elif isinstance(x, str):<br \/>\n        printstring(x, indent, prefix, suffix)<br \/>\n    else:<br \/>\n        printnumber(x, indent, prefix, suffix)<\/p>\n<p>def printdict(x, indent, prefix, suffix):<br \/>\n    print(f&#8217;printdict(x, {indent}, &#8220;{prefix}&#8221;, &#8220;{suffix}&#8221;)&#8217;)<br \/>\n    spaces = &#8221; &#8221; * indent<br \/>\n    print(spaces + prefix + &#8220;{&#8220;)<br \/>\n    for n, key in enumerate(x):<br \/>\n        comma = &#8220;,&#8221; if n!=len(x)-1 else &#8220;&#8221;<br \/>\n        indentprint(x[key], indent+2, str(key)+&#8221;: &#8220;, comma)<br \/>\n    print(spaces + &#8220;}&#8221; + suffix)<\/p>\n<p>def printlist(x, indent, prefix, suffix):<br \/>\n    print(f&#8217;printlist(x, {indent}, &#8220;{prefix}&#8221;, &#8220;{suffix}&#8221;)&#8217;)<br \/>\n    spaces = &#8221; &#8221; * indent<br \/>\n    print(spaces + prefix + &#8220;[&#8220;)<br \/>\n    for n, item in enumerate(x):<br \/>\n        comma = &#8220;,&#8221; if n!=len(x)-1 else &#8220;&#8221;<br \/>\n        indentprint(item, indent+2, &#8220;&#8221;, comma)<br \/>\n    print(spaces + &#8220;]&#8221; + suffix)<\/p>\n<p>def printstring(x, indent, prefix, suffix):<br \/>\n    print(f&#8217;printstring(x, {indent}, &#8220;{prefix}&#8221;, &#8220;{suffix}&#8221;)&#8217;)<br \/>\n    spaces = &#8221; &#8221; * indent<br \/>\n    print(spaces + prefix + &#8216;&#8221;&#8216; + str(x) + &#8216;&#8221;&#8216; + suffix)<\/p>\n<p>def printnumber(x, indent, prefix, suffix):<br \/>\n    print(f&#8217;printnumber(x, {indent}, &#8220;{prefix}&#8221;, &#8220;{suffix}&#8221;)&#8217;)<br \/>\n    spaces = &#8221; &#8221; * indent<br \/>\n    print(spaces + prefix + str(x) + suffix)<\/textarea><\/p>\n<div class=\"urvanov-syntax-highlighter-main\">\n<table class=\"crayon-table\">\n<tr class=\"urvanov-syntax-highlighter-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<div class=\"urvanov-syntax-highlighter-nums-content\">\n<p>1<\/p>\n<p>2<\/p>\n<p>3<\/p>\n<p>4<\/p>\n<p>5<\/p>\n<p>6<\/p>\n<p>7<\/p>\n<p>8<\/p>\n<p>9<\/p>\n<p>10<\/p>\n<p>11<\/p>\n<p>12<\/p>\n<p>13<\/p>\n<p>14<\/p>\n<p>15<\/p>\n<p>16<\/p>\n<p>17<\/p>\n<p>18<\/p>\n<p>19<\/p>\n<p>20<\/p>\n<p>21<\/p>\n<p>22<\/p>\n<p>23<\/p>\n<p>24<\/p>\n<p>25<\/p>\n<p>26<\/p>\n<p>27<\/p>\n<p>28<\/p>\n<p>29<\/p>\n<p>30<\/p>\n<p>31<\/p>\n<p>32<\/p>\n<p>33<\/p>\n<p>34<\/p>\n<p>35<\/p>\n<p>36<\/p>\n<p>37<\/p>\n<p>38<\/p>\n<\/div>\n<\/td>\n<td class=\"urvanov-syntax-highlighter-code\">\n<div class=\"crayon-pre\">\n<p><span class=\"crayon-e\">def <\/span><span class=\"crayon-e\">indentprint<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">x<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">indent<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-cn\">0<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">prefix<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-s\">&#8220;&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">suffix<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-s\">&#8220;&#8221;<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-i\">f<\/span><span class=\"crayon-s\">&#8216;indentprint(x, {indent}, &#8220;{prefix}&#8221;, &#8220;{suffix}&#8221;)&#8217;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">if<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">isinstance<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">x<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">dict<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">printdict<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">x<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">indent<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">prefix<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">suffix<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">elif <\/span><span class=\"crayon-e\">isinstance<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">x<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">list<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">printlist<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">x<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">indent<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">prefix<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">suffix<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">elif <\/span><span class=\"crayon-e\">isinstance<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">x<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">str<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">printstring<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">x<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">indent<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">prefix<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">suffix<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">else<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">printnumber<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">x<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">indent<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">prefix<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">suffix<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-e\">def <\/span><span class=\"crayon-e\">printdict<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">x<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">indent<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">prefix<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">suffix<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-i\">f<\/span><span class=\"crayon-s\">&#8216;printdict(x, {indent}, &#8220;{prefix}&#8221;, &#8220;{suffix}&#8221;)&#8217;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">spaces<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8221; &#8220;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">*<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">indent<\/span><\/p>\n<p><span class=\"crayon-e\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">spaces<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">+<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">prefix<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">+<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;{&#8220;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">for<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">n<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">key <\/span><span class=\"crayon-st\">in<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">enumerate<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">x<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">comma<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;,&#8221;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-st\">if<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">n<\/span><span class=\"crayon-o\">!=<\/span><span class=\"crayon-e\">len<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">x<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">&#8211;<\/span><span class=\"crayon-cn\">1<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-st\">else<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;&#8221;<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">indentprint<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">x<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-v\">key<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">indent<\/span><span class=\"crayon-o\">+<\/span><span class=\"crayon-cn\">2<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">str<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">key<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">+<\/span><span class=\"crayon-s\">&#8220;: &#8220;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">comma<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">spaces<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">+<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;}&#8221;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">+<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">suffix<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-e\">def <\/span><span class=\"crayon-e\">printlist<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">x<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">indent<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">prefix<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">suffix<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-i\">f<\/span><span class=\"crayon-s\">&#8216;printlist(x, {indent}, &#8220;{prefix}&#8221;, &#8220;{suffix}&#8221;)&#8217;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">spaces<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8221; &#8220;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">*<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">indent<\/span><\/p>\n<p><span class=\"crayon-e\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">spaces<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">+<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">prefix<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">+<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;[&#8220;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">for<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">n<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">item <\/span><span class=\"crayon-st\">in<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">enumerate<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">x<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">comma<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;,&#8221;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-st\">if<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">n<\/span><span class=\"crayon-o\">!=<\/span><span class=\"crayon-e\">len<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">x<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">&#8211;<\/span><span class=\"crayon-cn\">1<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-st\">else<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;&#8221;<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">indentprint<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">item<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">indent<\/span><span class=\"crayon-o\">+<\/span><span class=\"crayon-cn\">2<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">comma<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">spaces<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">+<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;]&#8221;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">+<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">suffix<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-e\">def <\/span><span class=\"crayon-e\">printstring<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">x<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">indent<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">prefix<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">suffix<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-i\">f<\/span><span class=\"crayon-s\">&#8216;printstring(x, {indent}, &#8220;{prefix}&#8221;, &#8220;{suffix}&#8221;)&#8217;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">spaces<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8221; &#8220;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">*<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">indent<\/span><\/p>\n<p><span class=\"crayon-e\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">spaces<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">+<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">prefix<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">+<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8216;&#8221;&#8216;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">+<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">str<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">x<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">+<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8216;&#8221;&#8216;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">+<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">suffix<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-e\">def <\/span><span class=\"crayon-e\">printnumber<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">x<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">indent<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">prefix<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">suffix<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-i\">f<\/span><span class=\"crayon-s\">&#8216;printnumber(x, {indent}, &#8220;{prefix}&#8221;, &#8220;{suffix}&#8221;)&#8217;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">spaces<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8221; &#8220;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">*<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">indent<\/span><\/p>\n<p><span class=\"crayon-e\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">spaces<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">+<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">prefix<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">+<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">str<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">x<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">+<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">suffix<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<\/div>\n<\/td>\n<\/tr>\n<\/table><\/div>\n<\/p><\/div>\n<p>and the output will be messed with more information:<\/p>\n<div id=\"urvanov-syntax-highlighter-61ce8fb48043a545851189\" class=\"urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate\" data-settings=\" minimize scroll-mouseover disable-anim\">\n<p><textarea class=\"urvanov-syntax-highlighter-plain print-no\" data-settings=\"dblclick\" readonly><br \/>\nindentprint(x, 0, &#8220;&#8221;, &#8220;&#8221;)<br \/>\nprintdict(x, 0, &#8220;&#8221;, &#8220;&#8221;)<br \/>\n{<br \/>\nindentprint(x, 2, &#8220;a: &#8220;, &#8220;,&#8221;)<br \/>\nprintlist(x, 2, &#8220;a: &#8220;, &#8220;,&#8221;)<br \/>\n  a: [<br \/>\nindentprint(x, 4, &#8220;&#8221;, &#8220;,&#8221;)<br \/>\nprintdict(x, 4, &#8220;&#8221;, &#8220;,&#8221;)<br \/>\n    {<br \/>\nindentprint(x, 6, &#8220;p: &#8220;, &#8220;,&#8221;)<br \/>\nprintnumber(x, 6, &#8220;p: &#8220;, &#8220;,&#8221;)<br \/>\n      p: 3,<br \/>\nindentprint(x, 6, &#8220;q: &#8220;, &#8220;,&#8221;)<br \/>\nprintnumber(x, 6, &#8220;q: &#8220;, &#8220;,&#8221;)<br \/>\n      q: 4,<br \/>\nindentprint(x, 6, &#8220;r: &#8220;, &#8220;&#8221;)<br \/>\nprintlist(x, 6, &#8220;r: &#8220;, &#8220;&#8221;)<br \/>\n      r: [<br \/>\nindentprint(x, 8, &#8220;&#8221;, &#8220;,&#8221;)<br \/>\nprintnumber(x, 8, &#8220;&#8221;, &#8220;,&#8221;)<br \/>\n        3,<br \/>\nindentprint(x, 8, &#8220;&#8221;, &#8220;,&#8221;)<br \/>\nprintnumber(x, 8, &#8220;&#8221;, &#8220;,&#8221;)<br \/>\n        4,<br \/>\nindentprint(x, 8, &#8220;&#8221;, &#8220;&#8221;)<br \/>\nprintnumber(x, 8, &#8220;&#8221;, &#8220;&#8221;)<br \/>\n        5<br \/>\n      ]<br \/>\n    },<br \/>\nindentprint(x, 4, &#8220;&#8221;, &#8220;,&#8221;)<br \/>\nprintdict(x, 4, &#8220;&#8221;, &#8220;,&#8221;)<br \/>\n    {<br \/>\nindentprint(x, 6, &#8220;f: &#8220;, &#8220;,&#8221;)<br \/>\nprintstring(x, 6, &#8220;f: &#8220;, &#8220;,&#8221;)<br \/>\n      f: &#8220;foo&#8221;,<br \/>\nindentprint(x, 6, &#8220;g: &#8220;, &#8220;&#8221;)<br \/>\nprintnumber(x, 6, &#8220;g: &#8220;, &#8220;&#8221;)<br \/>\n      g: 2.71<br \/>\n    },<br \/>\nindentprint(x, 4, &#8220;&#8221;, &#8220;&#8221;)<br \/>\nprintdict(x, 4, &#8220;&#8221;, &#8220;&#8221;)<br \/>\n    {<br \/>\nindentprint(x, 6, &#8220;u: &#8220;, &#8220;,&#8221;)<br \/>\nprintnumber(x, 6, &#8220;u: &#8220;, &#8220;,&#8221;)<br \/>\n      u: None,<br \/>\nindentprint(x, 6, &#8220;v: &#8220;, &#8220;&#8221;)<br \/>\nprintstring(x, 6, &#8220;v: &#8220;, &#8220;&#8221;)<br \/>\n      v: &#8220;bar&#8221;<br \/>\n    }<br \/>\n  ],<br \/>\nindentprint(x, 2, &#8220;c: &#8220;, &#8220;&#8221;)<br \/>\nprintdict(x, 2, &#8220;c: &#8220;, &#8220;&#8221;)<br \/>\n  c: {<br \/>\nindentprint(x, 4, &#8220;s: &#8220;, &#8220;,&#8221;)<br \/>\nprintlist(x, 4, &#8220;s: &#8220;, &#8220;,&#8221;)<br \/>\n    s: [<br \/>\nindentprint(x, 6, &#8220;&#8221;, &#8220;,&#8221;)<br \/>\nprintstring(x, 6, &#8220;&#8221;, &#8220;,&#8221;)<br \/>\n      &#8220;fizz&#8221;,<br \/>\nindentprint(x, 6, &#8220;&#8221;, &#8220;,&#8221;)<br \/>\nprintnumber(x, 6, &#8220;&#8221;, &#8220;,&#8221;)<br \/>\n      2,<br \/>\nindentprint(x, 6, &#8220;&#8221;, &#8220;&#8221;)<br \/>\nprintnumber(x, 6, &#8220;&#8221;, &#8220;&#8221;)<br \/>\n      1.1<br \/>\n    ],<br \/>\nindentprint(x, 4, &#8220;t: &#8220;, &#8220;&#8221;)<br \/>\nprintlist(x, 4, &#8220;t: &#8220;, &#8220;&#8221;)<br \/>\n    t: [<br \/>\n    ]<br \/>\n  }<br \/>\n}<\/textarea><\/p>\n<div class=\"urvanov-syntax-highlighter-main\">\n<table class=\"crayon-table\">\n<tr class=\"urvanov-syntax-highlighter-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<div class=\"urvanov-syntax-highlighter-nums-content\">\n<p>1<\/p>\n<p>2<\/p>\n<p>3<\/p>\n<p>4<\/p>\n<p>5<\/p>\n<p>6<\/p>\n<p>7<\/p>\n<p>8<\/p>\n<p>9<\/p>\n<p>10<\/p>\n<p>11<\/p>\n<p>12<\/p>\n<p>13<\/p>\n<p>14<\/p>\n<p>15<\/p>\n<p>16<\/p>\n<p>17<\/p>\n<p>18<\/p>\n<p>19<\/p>\n<p>20<\/p>\n<p>21<\/p>\n<p>22<\/p>\n<p>23<\/p>\n<p>24<\/p>\n<p>25<\/p>\n<p>26<\/p>\n<p>27<\/p>\n<p>28<\/p>\n<p>29<\/p>\n<p>30<\/p>\n<p>31<\/p>\n<p>32<\/p>\n<p>33<\/p>\n<p>34<\/p>\n<p>35<\/p>\n<p>36<\/p>\n<p>37<\/p>\n<p>38<\/p>\n<p>39<\/p>\n<p>40<\/p>\n<p>41<\/p>\n<p>42<\/p>\n<p>43<\/p>\n<p>44<\/p>\n<p>45<\/p>\n<p>46<\/p>\n<p>47<\/p>\n<p>48<\/p>\n<p>49<\/p>\n<p>50<\/p>\n<p>51<\/p>\n<p>52<\/p>\n<p>53<\/p>\n<p>54<\/p>\n<p>55<\/p>\n<p>56<\/p>\n<p>57<\/p>\n<p>58<\/p>\n<p>59<\/p>\n<p>60<\/p>\n<p>61<\/p>\n<p>62<\/p>\n<p>63<\/p>\n<p>64<\/p>\n<p>65<\/p>\n<p>66<\/p>\n<p>67<\/p>\n<p>68<\/p>\n<p>69<\/p>\n<p>70<\/p>\n<p>71<\/p>\n<p>72<\/p>\n<\/div>\n<\/td>\n<td class=\"urvanov-syntax-highlighter-code\">\n<div class=\"crayon-pre\">\n<p>indentprint(x, 0, &#8220;&#8221;, &#8220;&#8221;)<\/p>\n<p>printdict(x, 0, &#8220;&#8221;, &#8220;&#8221;)<\/p>\n<p>{<\/p>\n<p>indentprint(x, 2, &#8220;a: &#8220;, &#8220;,&#8221;)<\/p>\n<p>printlist(x, 2, &#8220;a: &#8220;, &#8220;,&#8221;)<\/p>\n<p>\u00a0\u00a0a: [<\/p>\n<p>indentprint(x, 4, &#8220;&#8221;, &#8220;,&#8221;)<\/p>\n<p>printdict(x, 4, &#8220;&#8221;, &#8220;,&#8221;)<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0{<\/p>\n<p>indentprint(x, 6, &#8220;p: &#8220;, &#8220;,&#8221;)<\/p>\n<p>printnumber(x, 6, &#8220;p: &#8220;, &#8220;,&#8221;)<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0p: 3,<\/p>\n<p>indentprint(x, 6, &#8220;q: &#8220;, &#8220;,&#8221;)<\/p>\n<p>printnumber(x, 6, &#8220;q: &#8220;, &#8220;,&#8221;)<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0q: 4,<\/p>\n<p>indentprint(x, 6, &#8220;r: &#8220;, &#8220;&#8221;)<\/p>\n<p>printlist(x, 6, &#8220;r: &#8220;, &#8220;&#8221;)<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0r: [<\/p>\n<p>indentprint(x, 8, &#8220;&#8221;, &#8220;,&#8221;)<\/p>\n<p>printnumber(x, 8, &#8220;&#8221;, &#8220;,&#8221;)<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a03,<\/p>\n<p>indentprint(x, 8, &#8220;&#8221;, &#8220;,&#8221;)<\/p>\n<p>printnumber(x, 8, &#8220;&#8221;, &#8220;,&#8221;)<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a04,<\/p>\n<p>indentprint(x, 8, &#8220;&#8221;, &#8220;&#8221;)<\/p>\n<p>printnumber(x, 8, &#8220;&#8221;, &#8220;&#8221;)<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a05<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0]<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0},<\/p>\n<p>indentprint(x, 4, &#8220;&#8221;, &#8220;,&#8221;)<\/p>\n<p>printdict(x, 4, &#8220;&#8221;, &#8220;,&#8221;)<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0{<\/p>\n<p>indentprint(x, 6, &#8220;f: &#8220;, &#8220;,&#8221;)<\/p>\n<p>printstring(x, 6, &#8220;f: &#8220;, &#8220;,&#8221;)<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0f: &#8220;foo&#8221;,<\/p>\n<p>indentprint(x, 6, &#8220;g: &#8220;, &#8220;&#8221;)<\/p>\n<p>printnumber(x, 6, &#8220;g: &#8220;, &#8220;&#8221;)<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0g: 2.71<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0},<\/p>\n<p>indentprint(x, 4, &#8220;&#8221;, &#8220;&#8221;)<\/p>\n<p>printdict(x, 4, &#8220;&#8221;, &#8220;&#8221;)<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0{<\/p>\n<p>indentprint(x, 6, &#8220;u: &#8220;, &#8220;,&#8221;)<\/p>\n<p>printnumber(x, 6, &#8220;u: &#8220;, &#8220;,&#8221;)<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0u: None,<\/p>\n<p>indentprint(x, 6, &#8220;v: &#8220;, &#8220;&#8221;)<\/p>\n<p>printstring(x, 6, &#8220;v: &#8220;, &#8220;&#8221;)<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0v: &#8220;bar&#8221;<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0}<\/p>\n<p>\u00a0\u00a0],<\/p>\n<p>indentprint(x, 2, &#8220;c: &#8220;, &#8220;&#8221;)<\/p>\n<p>printdict(x, 2, &#8220;c: &#8220;, &#8220;&#8221;)<\/p>\n<p>\u00a0\u00a0c: {<\/p>\n<p>indentprint(x, 4, &#8220;s: &#8220;, &#8220;,&#8221;)<\/p>\n<p>printlist(x, 4, &#8220;s: &#8220;, &#8220;,&#8221;)<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0s: [<\/p>\n<p>indentprint(x, 6, &#8220;&#8221;, &#8220;,&#8221;)<\/p>\n<p>printstring(x, 6, &#8220;&#8221;, &#8220;,&#8221;)<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&#8220;fizz&#8221;,<\/p>\n<p>indentprint(x, 6, &#8220;&#8221;, &#8220;,&#8221;)<\/p>\n<p>printnumber(x, 6, &#8220;&#8221;, &#8220;,&#8221;)<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a02,<\/p>\n<p>indentprint(x, 6, &#8220;&#8221;, &#8220;&#8221;)<\/p>\n<p>printnumber(x, 6, &#8220;&#8221;, &#8220;&#8221;)<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a01.1<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0],<\/p>\n<p>indentprint(x, 4, &#8220;t: &#8220;, &#8220;&#8221;)<\/p>\n<p>printlist(x, 4, &#8220;t: &#8220;, &#8220;&#8221;)<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0t: [<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0]<\/p>\n<p>\u00a0\u00a0}<\/p>\n<p>}<\/p>\n<\/div>\n<\/td>\n<\/tr>\n<\/table><\/div>\n<\/p><\/div>\n<p>So now we knows the order of how each function is invoked. This is the idea of a call stack. At any point of time, when we run a line of code in a function, we want to know who invoked this function.<\/p>\n<h2>Traceback upon exception<\/h2>\n<p>If we make one typo in the code like the following:<\/p>\n<div id=\"urvanov-syntax-highlighter-61ce8fb48043b413814387\" class=\"urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate\" data-settings=\" minimize scroll-mouseover disable-anim\">\n<p><textarea class=\"urvanov-syntax-highlighter-plain print-no\" data-settings=\"dblclick\" readonly><br \/>\ndef printdict(x, indent, prefix, suffix):<br \/>\n    spaces = &#8221; &#8221; * indent<br \/>\n    print(spaces + prefix + &#8220;{&#8220;)<br \/>\n    for n, key in enumerate(x):<br \/>\n        comma = &#8220;,&#8221; if n!=len(x)-1 else &#8220;&#8221;<br \/>\n        indentprint(x[key], indent+2, str(key)+&#8221;: &#8220;, comma)<br \/>\n    print(spaces + &#8220;}&#8221;) + suffix<\/textarea><\/p>\n<div class=\"urvanov-syntax-highlighter-main\">\n<table class=\"crayon-table\">\n<tr class=\"urvanov-syntax-highlighter-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<\/td>\n<td class=\"urvanov-syntax-highlighter-code\">\n<div class=\"crayon-pre\">\n<p><span class=\"crayon-e\">def <\/span><span class=\"crayon-e\">printdict<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">x<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">indent<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">prefix<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">suffix<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">spaces<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8221; &#8220;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">*<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">indent<\/span><\/p>\n<p><span class=\"crayon-e\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">spaces<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">+<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">prefix<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">+<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;{&#8220;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">for<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">n<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">key <\/span><span class=\"crayon-st\">in<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">enumerate<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">x<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">comma<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;,&#8221;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-st\">if<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">n<\/span><span class=\"crayon-o\">!=<\/span><span class=\"crayon-e\">len<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">x<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">&#8211;<\/span><span class=\"crayon-cn\">1<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-st\">else<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;&#8221;<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">indentprint<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">x<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-v\">key<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">indent<\/span><span class=\"crayon-o\">+<\/span><span class=\"crayon-cn\">2<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">str<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">key<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">+<\/span><span class=\"crayon-s\">&#8220;: &#8220;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">comma<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">spaces<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">+<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;}&#8221;<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">+<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">suffix<\/span><\/p>\n<\/div>\n<\/td>\n<\/tr>\n<\/table><\/div>\n<\/p><\/div>\n<p>The typo is at the last line, which the closing bracket should be at the end of line, not before any <code>+<\/code>. The return value of <code>print()<\/code> function is a Python <code>None<\/code> object. And adding something to <code>None<\/code> will trigger an exception.<\/p>\n<p>If you run this program using Python interpreter, you will see this:<\/p>\n<div id=\"urvanov-syntax-highlighter-61ce8fb48043c190020366\" class=\"urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate\" data-settings=\" minimize scroll-mouseover disable-anim\">\n<p><textarea class=\"urvanov-syntax-highlighter-plain print-no\" data-settings=\"dblclick\" readonly><br \/>\n{<br \/>\n  a: [<br \/>\n    {<br \/>\n      p: 3,<br \/>\n      q: 4,<br \/>\n      r: [<br \/>\n        3,<br \/>\n        4,<br \/>\n        5<br \/>\n      ]<br \/>\n    }<br \/>\nTraceback (most recent call last):<br \/>\n  File &#8220;tb.py&#8221;, line 52, in<br \/>\n    indentprint(data)<br \/>\n  File &#8220;tb.py&#8221;, line 3, in indentprint<br \/>\n    printdict(x, indent, prefix, suffix)<br \/>\n  File &#8220;tb.py&#8221;, line 16, in printdict<br \/>\n    indentprint(x[key], indent+2, str(key)+&#8221;: &#8220;, comma)<br \/>\n  File &#8220;tb.py&#8221;, line 5, in indentprint<br \/>\n    printlist(x, indent, prefix, suffix)<br \/>\n  File &#8220;tb.py&#8221;, line 24, in printlist<br \/>\n    indentprint(item, indent+2, &#8220;&#8221;, comma)<br \/>\n  File &#8220;tb.py&#8221;, line 3, in indentprint<br \/>\n    printdict(x, indent, prefix, suffix)<br \/>\n  File &#8220;tb.py&#8221;, line 17, in printdict<br \/>\n    print(spaces + &#8220;}&#8221;) + suffix<br \/>\nTypeError: unsupported operand type(s) for +: &#8216;NoneType&#8217; and &#8216;str&#8217;<\/textarea><\/p>\n<div class=\"urvanov-syntax-highlighter-main\">\n<table class=\"crayon-table\">\n<tr class=\"urvanov-syntax-highlighter-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<div class=\"urvanov-syntax-highlighter-nums-content\">\n<p>1<\/p>\n<p>2<\/p>\n<p>3<\/p>\n<p>4<\/p>\n<p>5<\/p>\n<p>6<\/p>\n<p>7<\/p>\n<p>8<\/p>\n<p>9<\/p>\n<p>10<\/p>\n<p>11<\/p>\n<p>12<\/p>\n<p>13<\/p>\n<p>14<\/p>\n<p>15<\/p>\n<p>16<\/p>\n<p>17<\/p>\n<p>18<\/p>\n<p>19<\/p>\n<p>20<\/p>\n<p>21<\/p>\n<p>22<\/p>\n<p>23<\/p>\n<p>24<\/p>\n<p>25<\/p>\n<p>26<\/p>\n<p>27<\/p>\n<\/div>\n<\/td>\n<td class=\"urvanov-syntax-highlighter-code\">\n<div class=\"crayon-pre\">\n<p>{<\/p>\n<p>\u00a0\u00a0a: [<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0{<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0p: 3,<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0q: 4,<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0r: [<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a03,<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a04,<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a05<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0]<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0}<\/p>\n<p>Traceback (most recent call last):<\/p>\n<p>\u00a0\u00a0File &#8220;tb.py&#8221;, line 52, in <\/p>\n<p>\u00a0\u00a0\u00a0\u00a0indentprint(data)<\/p>\n<p>\u00a0\u00a0File &#8220;tb.py&#8221;, line 3, in indentprint<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0printdict(x, indent, prefix, suffix)<\/p>\n<p>\u00a0\u00a0File &#8220;tb.py&#8221;, line 16, in printdict<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0indentprint(x[key], indent+2, str(key)+&#8221;: &#8220;, comma)<\/p>\n<p>\u00a0\u00a0File &#8220;tb.py&#8221;, line 5, in indentprint<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0printlist(x, indent, prefix, suffix)<\/p>\n<p>\u00a0\u00a0File &#8220;tb.py&#8221;, line 24, in printlist<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0indentprint(item, indent+2, &#8220;&#8221;, comma)<\/p>\n<p>\u00a0\u00a0File &#8220;tb.py&#8221;, line 3, in indentprint<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0printdict(x, indent, prefix, suffix)<\/p>\n<p>\u00a0\u00a0File &#8220;tb.py&#8221;, line 17, in printdict<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0print(spaces + &#8220;}&#8221;) + suffix<\/p>\n<p>TypeError: unsupported operand type(s) for +: &#8216;NoneType&#8217; and &#8216;str&#8217;<\/p>\n<\/div>\n<\/td>\n<\/tr>\n<\/table><\/div>\n<\/p><\/div>\n<p>The lines starting with \u201cTraceback (most recent call last):\u201d is the traceback. It is the <strong>stack<\/strong> of your program at the time when your program encountered the exception. In the above example, the traceback is in \u201cmost recent call last\u201d order. Hence your main function is at top while the one triggering the exception is at bottom. So we know the issue is inside the function <code>printdict()<\/code>.<\/p>\n<p>Usually you will see the error message at the end of the traceback. In this example, it is a <code>TypeError<\/code> triggered by adding <code>None<\/code> and string. But the traceback\u2019s help stops here. You need to figure out which one is <code>None<\/code> and which one is string. By reading the traceback, we also know the exception-triggering function <code>printdict()<\/code> is invokved by <code>indentprint()<\/code>, and it is in turn invoked by <code>printlist()<\/code>, and so on.<\/p>\n<p>If you run this in Jupyter notebook, the following is the output:<\/p>\n<div id=\"urvanov-syntax-highlighter-61ce8fb48043d873491378\" class=\"urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate\" data-settings=\" minimize scroll-mouseover disable-anim\">\n<p><textarea class=\"urvanov-syntax-highlighter-plain print-no\" data-settings=\"dblclick\" readonly><br \/>\n{<br \/>\n  a: [<br \/>\n    {<br \/>\n      p: 3,<br \/>\n      q: 4,<br \/>\n      r: [<br \/>\n        3,<br \/>\n        4,<br \/>\n        5<br \/>\n      ]<br \/>\n    }<br \/>\n&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\nTypeError                                 Traceback (most recent call last)<br \/>\n\/var\/folders\/6z\/w0ltb1ss08l593y5xt9jyl1w0000gn\/T\/ipykernel_37031\/2508041071.py in<br \/>\n&#8212;-&gt; 1 indentprint(x)<\/p>\n<p>\/var\/folders\/6z\/w0ltb1ss08l593y5xt9jyl1w0000gn\/T\/ipykernel_37031\/2327707064.py in indentprint(x, indent, prefix, suffix)<br \/>\n      1 def indentprint(x, indent=0, prefix=&#8221;&#8221;, suffix=&#8221;&#8221;):<br \/>\n      2     if isinstance(x, dict):<br \/>\n&#8212;-&gt; 3         printdict(x, indent, prefix, suffix)<br \/>\n      4     elif isinstance(x, list):<br \/>\n      5         printlist(x, indent, prefix, suffix)<\/p>\n<p>\/var\/folders\/6z\/w0ltb1ss08l593y5xt9jyl1w0000gn\/T\/ipykernel_37031\/2327707064.py in printdict(x, indent, prefix, suffix)<br \/>\n     14     for n, key in enumerate(x):<br \/>\n     15         comma = &#8220;,&#8221; if n!=len(x)-1 else &#8220;&#8221;<br \/>\n&#8212;&gt; 16         indentprint(x[key], indent+2, str(key)+&#8221;: &#8220;, comma)<br \/>\n     17     print(spaces + &#8220;}&#8221;) + suffix<br \/>\n     18 <\/p>\n<p>\/var\/folders\/6z\/w0ltb1ss08l593y5xt9jyl1w0000gn\/T\/ipykernel_37031\/2327707064.py in indentprint(x, indent, prefix, suffix)<br \/>\n      3         printdict(x, indent, prefix, suffix)<br \/>\n      4     elif isinstance(x, list):<br \/>\n&#8212;-&gt; 5         printlist(x, indent, prefix, suffix)<br \/>\n      6     elif isinstance(x, str):<br \/>\n      7         printstring(x, indent, prefix, suffix)<\/p>\n<p>\/var\/folders\/6z\/w0ltb1ss08l593y5xt9jyl1w0000gn\/T\/ipykernel_37031\/2327707064.py in printlist(x, indent, prefix, suffix)<br \/>\n     22     for n, item in enumerate(x):<br \/>\n     23         comma = &#8220;,&#8221; if n!=len(x)-1 else &#8220;&#8221;<br \/>\n&#8212;&gt; 24         indentprint(item, indent+2, &#8220;&#8221;, comma)<br \/>\n     25     print(spaces + &#8220;]&#8221; + suffix)<br \/>\n     26 <\/p>\n<p>\/var\/folders\/6z\/w0ltb1ss08l593y5xt9jyl1w0000gn\/T\/ipykernel_37031\/2327707064.py in indentprint(x, indent, prefix, suffix)<br \/>\n      1 def indentprint(x, indent=0, prefix=&#8221;&#8221;, suffix=&#8221;&#8221;):<br \/>\n      2     if isinstance(x, dict):<br \/>\n&#8212;-&gt; 3         printdict(x, indent, prefix, suffix)<br \/>\n      4     elif isinstance(x, list):<br \/>\n      5         printlist(x, indent, prefix, suffix)<\/p>\n<p>\/var\/folders\/6z\/w0ltb1ss08l593y5xt9jyl1w0000gn\/T\/ipykernel_37031\/2327707064.py in printdict(x, indent, prefix, suffix)<br \/>\n     15         comma = &#8220;,&#8221; if n!=len(x)-1 else &#8220;&#8221;<br \/>\n     16         indentprint(x[key], indent+2, str(key)+&#8221;: &#8220;, comma)<br \/>\n&#8212;&gt; 17     print(spaces + &#8220;}&#8221;) + suffix<br \/>\n     18<br \/>\n     19 def printlist(x, indent, prefix, suffix):<\/p>\n<p>TypeError: unsupported operand type(s) for +: &#8216;NoneType&#8217; and &#8216;str&#8217;<\/textarea><\/p>\n<div class=\"urvanov-syntax-highlighter-main\">\n<table class=\"crayon-table\">\n<tr class=\"urvanov-syntax-highlighter-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<div class=\"urvanov-syntax-highlighter-nums-content\">\n<p>1<\/p>\n<p>2<\/p>\n<p>3<\/p>\n<p>4<\/p>\n<p>5<\/p>\n<p>6<\/p>\n<p>7<\/p>\n<p>8<\/p>\n<p>9<\/p>\n<p>10<\/p>\n<p>11<\/p>\n<p>12<\/p>\n<p>13<\/p>\n<p>14<\/p>\n<p>15<\/p>\n<p>16<\/p>\n<p>17<\/p>\n<p>18<\/p>\n<p>19<\/p>\n<p>20<\/p>\n<p>21<\/p>\n<p>22<\/p>\n<p>23<\/p>\n<p>24<\/p>\n<p>25<\/p>\n<p>26<\/p>\n<p>27<\/p>\n<p>28<\/p>\n<p>29<\/p>\n<p>30<\/p>\n<p>31<\/p>\n<p>32<\/p>\n<p>33<\/p>\n<p>34<\/p>\n<p>35<\/p>\n<p>36<\/p>\n<p>37<\/p>\n<p>38<\/p>\n<p>39<\/p>\n<p>40<\/p>\n<p>41<\/p>\n<p>42<\/p>\n<p>43<\/p>\n<p>44<\/p>\n<p>45<\/p>\n<p>46<\/p>\n<p>47<\/p>\n<p>48<\/p>\n<p>49<\/p>\n<p>50<\/p>\n<p>51<\/p>\n<p>52<\/p>\n<p>53<\/p>\n<p>54<\/p>\n<p>55<\/p>\n<p>56<\/p>\n<p>57<\/p>\n<p>58<\/p>\n<p>59<\/p>\n<\/div>\n<\/td>\n<td class=\"urvanov-syntax-highlighter-code\">\n<div class=\"crayon-pre\">\n<p>{<\/p>\n<p>\u00a0\u00a0a: [<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0{<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0p: 3,<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0q: 4,<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0r: [<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a03,<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a04,<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a05<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0]<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0}<\/p>\n<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<\/p>\n<p>TypeError\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Traceback (most recent call last)<\/p>\n<p>\/var\/folders\/6z\/w0ltb1ss08l593y5xt9jyl1w0000gn\/T\/ipykernel_37031\/2508041071.py in <\/p>\n<p>&#8212;-&gt; 1 indentprint(x)<\/p>\n<p>\u00a0<\/p>\n<p>\/var\/folders\/6z\/w0ltb1ss08l593y5xt9jyl1w0000gn\/T\/ipykernel_37031\/2327707064.py in indentprint(x, indent, prefix, suffix)<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a01 def indentprint(x, indent=0, prefix=&#8221;&#8221;, suffix=&#8221;&#8221;):<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a02\u00a0\u00a0\u00a0\u00a0 if isinstance(x, dict):<\/p>\n<p>&#8212;-&gt; 3\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 printdict(x, indent, prefix, suffix)<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a04\u00a0\u00a0\u00a0\u00a0 elif isinstance(x, list):<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a05\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 printlist(x, indent, prefix, suffix)<\/p>\n<p>\u00a0<\/p>\n<p>\/var\/folders\/6z\/w0ltb1ss08l593y5xt9jyl1w0000gn\/T\/ipykernel_37031\/2327707064.py in printdict(x, indent, prefix, suffix)<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0 14\u00a0\u00a0\u00a0\u00a0 for n, key in enumerate(x):<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0 15\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 comma = &#8220;,&#8221; if n!=len(x)-1 else &#8220;&#8221;<\/p>\n<p>&#8212;&gt; 16\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 indentprint(x[key], indent+2, str(key)+&#8221;: &#8220;, comma)<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0 17\u00a0\u00a0\u00a0\u00a0 print(spaces + &#8220;}&#8221;) + suffix<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0 18 <\/p>\n<p>\u00a0<\/p>\n<p>\/var\/folders\/6z\/w0ltb1ss08l593y5xt9jyl1w0000gn\/T\/ipykernel_37031\/2327707064.py in indentprint(x, indent, prefix, suffix)<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a03\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 printdict(x, indent, prefix, suffix)<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a04\u00a0\u00a0\u00a0\u00a0 elif isinstance(x, list):<\/p>\n<p>&#8212;-&gt; 5\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 printlist(x, indent, prefix, suffix)<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a06\u00a0\u00a0\u00a0\u00a0 elif isinstance(x, str):<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a07\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 printstring(x, indent, prefix, suffix)<\/p>\n<p>\u00a0<\/p>\n<p>\/var\/folders\/6z\/w0ltb1ss08l593y5xt9jyl1w0000gn\/T\/ipykernel_37031\/2327707064.py in printlist(x, indent, prefix, suffix)<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0 22\u00a0\u00a0\u00a0\u00a0 for n, item in enumerate(x):<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0 23\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 comma = &#8220;,&#8221; if n!=len(x)-1 else &#8220;&#8221;<\/p>\n<p>&#8212;&gt; 24\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 indentprint(item, indent+2, &#8220;&#8221;, comma)<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0 25\u00a0\u00a0\u00a0\u00a0 print(spaces + &#8220;]&#8221; + suffix)<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0 26 <\/p>\n<p>\u00a0<\/p>\n<p>\/var\/folders\/6z\/w0ltb1ss08l593y5xt9jyl1w0000gn\/T\/ipykernel_37031\/2327707064.py in indentprint(x, indent, prefix, suffix)<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a01 def indentprint(x, indent=0, prefix=&#8221;&#8221;, suffix=&#8221;&#8221;):<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a02\u00a0\u00a0\u00a0\u00a0 if isinstance(x, dict):<\/p>\n<p>&#8212;-&gt; 3\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 printdict(x, indent, prefix, suffix)<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a04\u00a0\u00a0\u00a0\u00a0 elif isinstance(x, list):<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a05\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 printlist(x, indent, prefix, suffix)<\/p>\n<p>\u00a0<\/p>\n<p>\/var\/folders\/6z\/w0ltb1ss08l593y5xt9jyl1w0000gn\/T\/ipykernel_37031\/2327707064.py in printdict(x, indent, prefix, suffix)<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0 15\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 comma = &#8220;,&#8221; if n!=len(x)-1 else &#8220;&#8221;<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0 16\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 indentprint(x[key], indent+2, str(key)+&#8221;: &#8220;, comma)<\/p>\n<p>&#8212;&gt; 17\u00a0\u00a0\u00a0\u00a0 print(spaces + &#8220;}&#8221;) + suffix<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0 18 <\/p>\n<p>\u00a0\u00a0\u00a0\u00a0 19 def printlist(x, indent, prefix, suffix):<\/p>\n<p>\u00a0<\/p>\n<p>TypeError: unsupported operand type(s) for +: &#8216;NoneType&#8217; and &#8216;str&#8217;<\/p>\n<\/div>\n<\/td>\n<\/tr>\n<\/table><\/div>\n<\/p><\/div>\n<p>The information is essentially the same, but it gives you the lines before. and after each function call.<\/p>\n<h2>Triggering traceback manually<\/h2>\n<p>The easiest way to print a traceback is to add a <code>raise<\/code> statement to manually create an exception. But this will also terminate your program. If we want to print the stack at any time even without any exception, we can do so like the following:<\/p>\n<div id=\"urvanov-syntax-highlighter-61ce8fb48043e334222549\" class=\"urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate\" data-settings=\" minimize scroll-mouseover disable-anim\">\n<p><textarea class=\"urvanov-syntax-highlighter-plain print-no\" data-settings=\"dblclick\" readonly><br \/>\nimport traceback<\/p>\n<p>def printdict(x, indent, prefix, suffix):<br \/>\n    spaces = &#8221; &#8221; * indent<br \/>\n    print(spaces + prefix + &#8220;{&#8220;)<br \/>\n    for n, key in enumerate(x):<br \/>\n        comma = &#8220;,&#8221; if n!=len(x)-1 else &#8220;&#8221;<br \/>\n        indentprint(x[key], indent+2, str(key)+&#8221;: &#8220;, comma)<br \/>\n    traceback.print_stack()    # print the current call stack<br \/>\n    print(spaces + &#8220;}&#8221; + suffix)<\/textarea><\/p>\n<div class=\"urvanov-syntax-highlighter-main\">\n<table class=\"crayon-table\">\n<tr class=\"urvanov-syntax-highlighter-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<\/td>\n<td class=\"urvanov-syntax-highlighter-code\">\n<div class=\"crayon-pre\">\n<p><span class=\"crayon-e\">import <\/span><span class=\"crayon-e\">traceback<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-e\">def <\/span><span class=\"crayon-e\">printdict<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">x<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">indent<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">prefix<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">suffix<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">spaces<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8221; &#8220;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">*<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">indent<\/span><\/p>\n<p><span class=\"crayon-e\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">spaces<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">+<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">prefix<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">+<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;{&#8220;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">for<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">n<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">key <\/span><span class=\"crayon-st\">in<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">enumerate<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">x<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">comma<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;,&#8221;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-st\">if<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">n<\/span><span class=\"crayon-o\">!=<\/span><span class=\"crayon-e\">len<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">x<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">&#8211;<\/span><span class=\"crayon-cn\">1<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-st\">else<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;&#8221;<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">indentprint<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">x<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-v\">key<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">indent<\/span><span class=\"crayon-o\">+<\/span><span class=\"crayon-cn\">2<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">str<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">key<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">+<\/span><span class=\"crayon-s\">&#8220;: &#8220;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">comma<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">traceback<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">print_stack<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-p\"># print the current call stack<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">spaces<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">+<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;}&#8221;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">+<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">suffix<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<\/div>\n<\/td>\n<\/tr>\n<\/table><\/div>\n<\/p><\/div>\n<p>The line <code>traceback.print_stack()<\/code> will print the current call stack.<\/p>\n<p>But indeed, we often want to print the stack only when there is error (so we learn more about why it is so). The more common use case is the following:<\/p>\n<div id=\"urvanov-syntax-highlighter-61ce8fb48043f823944698\" class=\"urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate\" data-settings=\" minimize scroll-mouseover disable-anim\">\n<p><textarea class=\"urvanov-syntax-highlighter-plain print-no\" data-settings=\"dblclick\" readonly><br \/>\nimport traceback<br \/>\nimport random<\/p>\n<p>def compute():<br \/>\n    n = random.randint(0, 10)<br \/>\n    m = random.randint(0, 10)<br \/>\n    return n\/m<\/p>\n<p>def compute_many(n_times):<br \/>\n    try:<br \/>\n        for _ in range(n_times):<br \/>\n            x = compute()<br \/>\n        print(f&#8221;Completed {n_times} times&#8221;)<br \/>\n    except:<br \/>\n        print(&#8220;Something wrong&#8221;)<br \/>\n        traceback.print_exc()<\/p>\n<p>compute_many(100)<\/textarea><\/p>\n<div class=\"urvanov-syntax-highlighter-main\">\n<table class=\"crayon-table\">\n<tr class=\"urvanov-syntax-highlighter-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<div class=\"urvanov-syntax-highlighter-nums-content\">\n<p>1<\/p>\n<p>2<\/p>\n<p>3<\/p>\n<p>4<\/p>\n<p>5<\/p>\n<p>6<\/p>\n<p>7<\/p>\n<p>8<\/p>\n<p>9<\/p>\n<p>10<\/p>\n<p>11<\/p>\n<p>12<\/p>\n<p>13<\/p>\n<p>14<\/p>\n<p>15<\/p>\n<p>16<\/p>\n<p>17<\/p>\n<p>18<\/p>\n<\/div>\n<\/td>\n<td class=\"urvanov-syntax-highlighter-code\">\n<div class=\"crayon-pre\">\n<p><span class=\"crayon-e\">import <\/span><span class=\"crayon-e\">traceback<\/span><\/p>\n<p><span class=\"crayon-e\">import <\/span><span class=\"crayon-e\">random<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-e\">def <\/span><span class=\"crayon-e\">compute<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">n<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">random<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">randint<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-cn\">0<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">10<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">m<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">random<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">randint<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-cn\">0<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">10<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">return<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">n<\/span><span class=\"crayon-o\">\/<\/span><span class=\"crayon-i\">m<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-e\">def <\/span><span class=\"crayon-e\">compute_many<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">n_times<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">try<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">for<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-i\">_<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-st\">in<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">range<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">n_times<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">x<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">compute<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-i\">f<\/span><span class=\"crayon-s\">&#8220;Completed {n_times} times&#8221;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">except<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">&#8220;Something wrong&#8221;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">traceback<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">print_exc<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-e\">compute_many<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-cn\">100<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<\/div>\n<\/td>\n<\/tr>\n<\/table><\/div>\n<\/p><\/div>\n<p>This is a typical pattern for repeatedly calculating a function, such as Monte Carlo simulation. But if we are not careful enough, we may run into some error, such as in the above example, we may have division by zero. The problem is, in case of more complicated computation you can\u2019t easily spot the flaw. Such as in above, the issue buried inside the call to <code>compute()<\/code>. Therefore it is helpful to understand how we get the error. But at the same time we want to handle the case of error rather than let the entire program terminate. If we use the <code>try-catch<\/code> construct, the traceback will not be print by default. Therefore we need the use the <code>traceback.print_exc()<\/code> statement to do it manually.<\/p>\n<p>Actually we can have the traceback more elaborated. Because the traceback is the call stack and indeed we can examine each function in the call stack and check the variables in each level. In the complicated case, this is the function I usually use to do more detailed trace:<\/p>\n<div id=\"urvanov-syntax-highlighter-61ce8fb480440647566659\" class=\"urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate\" data-settings=\" minimize scroll-mouseover disable-anim\">\n<p><textarea class=\"urvanov-syntax-highlighter-plain print-no\" data-settings=\"dblclick\" readonly><br \/>\ndef print_tb_with_local():<br \/>\n    &#8220;&#8221;&#8221;Print stack trace with local variables. This does not need to be in<br \/>\n    exception. Print is using the system&#8217;s print() function to stderr.<br \/>\n    &#8220;&#8221;&#8221;<br \/>\n    import traceback, sys<br \/>\n    tb = sys.exc_info()[2]<br \/>\n    stack = []<br \/>\n    while tb:<br \/>\n        stack.append(tb.tb_frame)<br \/>\n        tb = tb.tb_next()<br \/>\n    traceback.print_exc()<br \/>\n    print(&#8220;Locals by frame, most recent call first&#8221;, file=sys.stderr)<br \/>\n    for frame in stack:<br \/>\n        print(&#8220;Frame {0} in {1} at line {2}&#8221;.format(<br \/>\n            frame.f_code.co_name,<br \/>\n            frame.f_code.co_filename,<br \/>\n            frame.f_lineno), file=sys.stderr)<br \/>\n        for key, value in frame.f_locals.items():<br \/>\n            print(&#8220;t%20s = &#8221; % key, file=sys.stderr)<br \/>\n            try:<br \/>\n                if &#8216;__repr__&#8217; in dir(value):<br \/>\n                    print(value.__repr__(), file=sys.stderr)<br \/>\n                elif &#8216;__str__&#8217; in dir(value):<br \/>\n                    print(value.__str__(), file=sys.stderr)<br \/>\n                else:<br \/>\n                    print(value, file=sys.stderr)<br \/>\n            except:<br \/>\n                print(&#8220;&#8221;, file=sys.stderr)<\/textarea><\/p>\n<div class=\"urvanov-syntax-highlighter-main\">\n<table class=\"crayon-table\">\n<tr class=\"urvanov-syntax-highlighter-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<div class=\"urvanov-syntax-highlighter-nums-content\">\n<p>1<\/p>\n<p>2<\/p>\n<p>3<\/p>\n<p>4<\/p>\n<p>5<\/p>\n<p>6<\/p>\n<p>7<\/p>\n<p>8<\/p>\n<p>9<\/p>\n<p>10<\/p>\n<p>11<\/p>\n<p>12<\/p>\n<p>13<\/p>\n<p>14<\/p>\n<p>15<\/p>\n<p>16<\/p>\n<p>17<\/p>\n<p>18<\/p>\n<p>19<\/p>\n<p>20<\/p>\n<p>21<\/p>\n<p>22<\/p>\n<p>23<\/p>\n<p>24<\/p>\n<p>25<\/p>\n<p>26<\/p>\n<p>27<\/p>\n<p>28<\/p>\n<\/div>\n<\/td>\n<td class=\"urvanov-syntax-highlighter-code\">\n<div class=\"crayon-pre\">\n<p><span class=\"crayon-e\">def <\/span><span class=\"crayon-e\">print_tb_with_local<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;&#8221;<\/span><span class=\"crayon-s\">&#8220;Print stack trace with local variables. This does not need to be in<\/span><\/p>\n<p><span class=\"crayon-s\">\u00a0\u00a0\u00a0\u00a0exception. Print is using the system&#8217;s print() function to stderr.<\/span><\/p>\n<p><span class=\"crayon-s\">\u00a0\u00a0\u00a0\u00a0&#8220;<\/span><span class=\"crayon-s\">&#8220;&#8221;<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-v\">traceback<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">sys<\/span><\/p>\n<p><span class=\"crayon-e\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">tb<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">sys<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">exc_info<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-cn\">2<\/span><span class=\"crayon-sy\">]<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">stack<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-sy\">]<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">while<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">tb<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">stack<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">append<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">tb<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">tb_frame<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">tb<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">tb<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">tb_next<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">traceback<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">print_exc<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">&#8220;Locals by frame, most recent call first&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">file<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-v\">sys<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">stderr<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">for<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">frame <\/span><span class=\"crayon-st\">in<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">stack<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">&#8220;Frame {0} in {1} at line {2}&#8221;<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">format<\/span><span class=\"crayon-sy\">(<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">frame<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">f_code<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">co_name<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">frame<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">f_code<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">co_filename<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">frame<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">f_lineno<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">file<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-v\">sys<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">stderr<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">for<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">key<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">value <\/span><span class=\"crayon-st\">in<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">frame<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">f_locals<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">items<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">&#8220;t%20s = &#8220;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">%<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">key<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">file<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-v\">sys<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">stderr<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">try<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">if<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8216;__repr__&#8217;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-st\">in<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">dir<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">value<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">value<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">__repr__<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">file<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-v\">sys<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">stderr<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-i\">elif<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8216;__str__&#8217;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-st\">in<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">dir<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">value<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">value<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">__str__<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">file<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-v\">sys<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">stderr<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">else<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">value<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">file<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-v\">sys<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">stderr<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">except<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">&#8220;&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">file<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-v\">sys<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">stderr<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<\/div>\n<\/td>\n<\/tr>\n<\/table><\/div>\n<\/p><\/div>\n<h2>An example in model training<\/h2>\n<p>The call stack as reported in the traceback has a limitation: You can only see the Python functions. It should be just fine for the program you wrote but many large libraries in Python have part of them written in another language and compiled into binary. An example is Tensorflow. All the underlying operation are in binary for the performance. Hence if you run the following code, you will see something different:<\/p>\n<div id=\"urvanov-syntax-highlighter-61ce8fb480443426924031\" class=\"urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate\" data-settings=\" minimize scroll-mouseover disable-anim\">\n<p><textarea class=\"urvanov-syntax-highlighter-plain print-no\" data-settings=\"dblclick\" readonly><br \/>\nimport numpy as np<\/p>\n<p>sequence = np.arange(0.1, 1.0, 0.1)  # 0.1 to 0.9<br \/>\nn_in = len(sequence)<br \/>\nsequence = sequence.reshape((1, n_in, 1))<\/p>\n<p># define model<br \/>\nimport tensorflow as tf<br \/>\nfrom tensorflow.keras.layers import LSTM, RepeatVector, Dense, TimeDistributed, Input<br \/>\nfrom tensorflow.keras import Sequential, Model<\/p>\n<p>model = Sequential([<br \/>\n    LSTM(100, activation=&#8221;relu&#8221;, input_shape=(n_in+1, 1)),<br \/>\n    RepeatVector(n_in),<br \/>\n    LSTM(100, activation=&#8221;relu&#8221;, return_sequences=True),<br \/>\n    TimeDistributed(Dense(1))<br \/>\n])<br \/>\nmodel.compile(optimizer=&#8221;adam&#8221;, loss=&#8221;mse&#8221;)<\/p>\n<p>model.fit(sequence, sequence, epochs=300, verbose=0)<\/textarea><\/p>\n<div class=\"urvanov-syntax-highlighter-main\">\n<table class=\"crayon-table\">\n<tr class=\"urvanov-syntax-highlighter-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<div class=\"urvanov-syntax-highlighter-nums-content\">\n<p>1<\/p>\n<p>2<\/p>\n<p>3<\/p>\n<p>4<\/p>\n<p>5<\/p>\n<p>6<\/p>\n<p>7<\/p>\n<p>8<\/p>\n<p>9<\/p>\n<p>10<\/p>\n<p>11<\/p>\n<p>12<\/p>\n<p>13<\/p>\n<p>14<\/p>\n<p>15<\/p>\n<p>16<\/p>\n<p>17<\/p>\n<p>18<\/p>\n<p>19<\/p>\n<p>20<\/p>\n<\/div>\n<\/td>\n<td class=\"urvanov-syntax-highlighter-code\">\n<div class=\"crayon-pre\">\n<p><span class=\"crayon-e\">import <\/span><span class=\"crayon-e\">numpy <\/span><span class=\"crayon-st\">as<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">np<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-v\">sequence<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">np<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">arange<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-cn\">0.1<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">1.0<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">0.1<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-h\">\u00a0\u00a0<\/span><span class=\"crayon-p\"># 0.1 to 0.9<\/span><\/p>\n<p><span class=\"crayon-v\">n_in<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">len<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">sequence<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-v\">sequence<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">sequence<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">reshape<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-cn\">1<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">n_in<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">1<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-p\"># define model<\/span><\/p>\n<p><span class=\"crayon-e\">import <\/span><span class=\"crayon-e\">tensorflow <\/span><span class=\"crayon-st\">as<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">tf<\/span><\/p>\n<p><span class=\"crayon-e\">from <\/span><span class=\"crayon-v\">tensorflow<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">keras<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">layers <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-v\">LSTM<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">RepeatVector<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">Dense<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">TimeDistributed<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">Input<\/span><\/p>\n<p><span class=\"crayon-e\">from <\/span><span class=\"crayon-v\">tensorflow<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">keras <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-v\">Sequential<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">Model<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-v\">model<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">Sequential<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">[<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">LSTM<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-cn\">100<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">activation<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-s\">&#8220;relu&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">input_shape<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">n_in<\/span><span class=\"crayon-o\">+<\/span><span class=\"crayon-cn\">1<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">1<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">RepeatVector<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">n_in<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">LSTM<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-cn\">100<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">activation<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-s\">&#8220;relu&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">return_sequences<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-t\">True<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">TimeDistributed<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-e\">Dense<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-cn\">1<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-v\">model<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">compile<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">optimizer<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-s\">&#8220;adam&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">loss<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-s\">&#8220;mse&#8221;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-v\">model<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">fit<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">sequence<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">sequence<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">epochs<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-cn\">300<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">verbose<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-cn\">0<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<\/div>\n<\/td>\n<\/tr>\n<\/table><\/div>\n<\/p><\/div>\n<p>The <code>input_shape<\/code> parameter to the first LSTM layer in the model should be <code>(n_in, 1)<\/code> to match the input data, rather than <code>(n_in+1, 1)<\/code>. This code will print the following error once you invoked the last line:<\/p>\n<div id=\"urvanov-syntax-highlighter-61ce8fb480444938651387\" class=\"urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate\" data-settings=\" minimize scroll-mouseover disable-anim\">\n<p><textarea class=\"urvanov-syntax-highlighter-plain print-no\" data-settings=\"dblclick\" readonly><br \/>\nTraceback (most recent call last):<br \/>\n  File &#8220;trback3.py&#8221;, line 20, in<br \/>\n    model.fit(sequence, sequence, epochs=300, verbose=0)<br \/>\n  File &#8220;\/usr\/local\/lib\/python3.9\/site-packages\/keras\/utils\/traceback_utils.py&#8221;, line 67, in error_handler<br \/>\n    raise e.with_traceback(filtered_tb) from None<br \/>\n  File &#8220;\/usr\/local\/lib\/python3.9\/site-packages\/tensorflow\/python\/framework\/func_graph.py&#8221;, line 1129, in autograph_handler<br \/>\n    raise e.ag_error_metadata.to_exception(e)<br \/>\nValueError: in user code:<\/p>\n<p>    File &#8220;\/usr\/local\/lib\/python3.9\/site-packages\/keras\/engine\/training.py&#8221;, line 878, in train_function  *<br \/>\n        return step_function(self, iterator)<br \/>\n    File &#8220;\/usr\/local\/lib\/python3.9\/site-packages\/keras\/engine\/training.py&#8221;, line 867, in step_function  **<br \/>\n        outputs = model.distribute_strategy.run(run_step, args=(data,))<br \/>\n    File &#8220;\/usr\/local\/lib\/python3.9\/site-packages\/keras\/engine\/training.py&#8221;, line 860, in run_step  **<br \/>\n        outputs = model.train_step(data)<br \/>\n    File &#8220;\/usr\/local\/lib\/python3.9\/site-packages\/keras\/engine\/training.py&#8221;, line 808, in train_step<br \/>\n        y_pred = self(x, training=True)<br \/>\n    File &#8220;\/usr\/local\/lib\/python3.9\/site-packages\/keras\/utils\/traceback_utils.py&#8221;, line 67, in error_handler<br \/>\n        raise e.with_traceback(filtered_tb) from None<br \/>\n    File &#8220;\/usr\/local\/lib\/python3.9\/site-packages\/keras\/engine\/input_spec.py&#8221;, line 263, in assert_input_compatibility<br \/>\n        raise ValueError(f&#8217;Input {input_index} of layer &#8220;{layer_name}&#8221; is &#8216;<\/p>\n<p>    ValueError: Input 0 of layer &#8220;sequential&#8221; is incompatible with the layer: expected shape=(None, 10, 1), found shape=(None, 9, 1)<\/textarea><\/p>\n<div class=\"urvanov-syntax-highlighter-main\">\n<table class=\"crayon-table\">\n<tr class=\"urvanov-syntax-highlighter-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<div class=\"urvanov-syntax-highlighter-nums-content\">\n<p>1<\/p>\n<p>2<\/p>\n<p>3<\/p>\n<p>4<\/p>\n<p>5<\/p>\n<p>6<\/p>\n<p>7<\/p>\n<p>8<\/p>\n<p>9<\/p>\n<p>10<\/p>\n<p>11<\/p>\n<p>12<\/p>\n<p>13<\/p>\n<p>14<\/p>\n<p>15<\/p>\n<p>16<\/p>\n<p>17<\/p>\n<p>18<\/p>\n<p>19<\/p>\n<p>20<\/p>\n<p>21<\/p>\n<p>22<\/p>\n<p>23<\/p>\n<\/div>\n<\/td>\n<td class=\"urvanov-syntax-highlighter-code\">\n<div class=\"crayon-pre\">\n<p>Traceback (most recent call last):<\/p>\n<p>\u00a0\u00a0File &#8220;trback3.py&#8221;, line 20, in <\/p>\n<p>\u00a0\u00a0\u00a0\u00a0model.fit(sequence, sequence, epochs=300, verbose=0)<\/p>\n<p>\u00a0\u00a0File &#8220;\/usr\/local\/lib\/python3.9\/site-packages\/keras\/utils\/traceback_utils.py&#8221;, line 67, in error_handler<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0raise e.with_traceback(filtered_tb) from None<\/p>\n<p>\u00a0\u00a0File &#8220;\/usr\/local\/lib\/python3.9\/site-packages\/tensorflow\/python\/framework\/func_graph.py&#8221;, line 1129, in autograph_handler<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0raise e.ag_error_metadata.to_exception(e)<\/p>\n<p>ValueError: in user code:<\/p>\n<p>\u00a0<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0File &#8220;\/usr\/local\/lib\/python3.9\/site-packages\/keras\/engine\/training.py&#8221;, line 878, in train_function\u00a0\u00a0*<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return step_function(self, iterator)<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0File &#8220;\/usr\/local\/lib\/python3.9\/site-packages\/keras\/engine\/training.py&#8221;, line 867, in step_function\u00a0\u00a0**<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0outputs = model.distribute_strategy.run(run_step, args=(data,))<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0File &#8220;\/usr\/local\/lib\/python3.9\/site-packages\/keras\/engine\/training.py&#8221;, line 860, in run_step\u00a0\u00a0**<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0outputs = model.train_step(data)<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0File &#8220;\/usr\/local\/lib\/python3.9\/site-packages\/keras\/engine\/training.py&#8221;, line 808, in train_step<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0y_pred = self(x, training=True)<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0File &#8220;\/usr\/local\/lib\/python3.9\/site-packages\/keras\/utils\/traceback_utils.py&#8221;, line 67, in error_handler<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0raise e.with_traceback(filtered_tb) from None<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0File &#8220;\/usr\/local\/lib\/python3.9\/site-packages\/keras\/engine\/input_spec.py&#8221;, line 263, in assert_input_compatibility<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0raise ValueError(f&#8217;Input {input_index} of layer &#8220;{layer_name}&#8221; is &#8216;<\/p>\n<p>\u00a0<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0ValueError: Input 0 of layer &#8220;sequential&#8221; is incompatible with the layer: expected shape=(None, 10, 1), found shape=(None, 9, 1)<\/p>\n<\/div>\n<\/td>\n<\/tr>\n<\/table><\/div>\n<\/p><\/div>\n<p>If you look at the traceback, you cannot really see the complete call stack. For example, the top frame you know you called <code>model.fit()<\/code> but the second frame is from a function named <code>error_handler()<\/code>. Which you cannot see how the <code>fit()<\/code> function triggered that. This is because Tensorflow is highly optimized. A lot of stuff is hidden in compiled code and not visible by the Python interpreter.<\/p>\n<p>In this case, it is essential to patiently read the traceback and find the clue to the cause. Of course, usually the error message should give you some useful hints as well.<\/p>\n<h2 id=\"Further-Reading\">Further Reading<\/h2>\n<p>This section provides more resources on the topic if you are looking to go deeper.<\/p>\n<h3 id=\"Books\">Books<\/h3>\n<h3 id=\"API-Reference\">Python Official Documentation<\/h3>\n<h2 id=\"Summary\">Summary<\/h2>\n<p>In this tutorial, you discovered how to read and print the traceback from a Python program.<\/p>\n<p>Specifically, you learned:<\/p>\n<ul>\n<li>What information the traceback tells you<\/li>\n<li>How to print a traceback at any point of your program without raising an exception<\/li>\n<\/ul>\n<p>In the next post, we will see how we can navigate the call stack inside the Python debugger.<\/p>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>https:\/\/machinelearningmastery.com\/understanding-traceback-in-python\/<\/p>\n","protected":false},"author":0,"featured_media":1418,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[3],"tags":[],"_links":{"self":[{"href":"https:\/\/salarydistribution.com\/machine-learning\/wp-json\/wp\/v2\/posts\/1417"}],"collection":[{"href":"https:\/\/salarydistribution.com\/machine-learning\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/salarydistribution.com\/machine-learning\/wp-json\/wp\/v2\/types\/post"}],"replies":[{"embeddable":true,"href":"https:\/\/salarydistribution.com\/machine-learning\/wp-json\/wp\/v2\/comments?post=1417"}],"version-history":[{"count":0,"href":"https:\/\/salarydistribution.com\/machine-learning\/wp-json\/wp\/v2\/posts\/1417\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/salarydistribution.com\/machine-learning\/wp-json\/wp\/v2\/media\/1418"}],"wp:attachment":[{"href":"https:\/\/salarydistribution.com\/machine-learning\/wp-json\/wp\/v2\/media?parent=1417"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/salarydistribution.com\/machine-learning\/wp-json\/wp\/v2\/categories?post=1417"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/salarydistribution.com\/machine-learning\/wp-json\/wp\/v2\/tags?post=1417"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}