天天看點

python标準庫學習8

<code>import</code> <code>sys</code>

<code>import</code> <code>string</code>

<code>class</code> <code>redirect:</code>

<code>    </code><code>def</code> <code>_ _init_ _(</code><code>self</code><code>, stdout):</code>

<code>        </code><code>self</code><code>.stdout</code><code>=</code> <code>stdout</code>

<code>    </code><code>def</code> <code>write(</code><code>self</code><code>, s):</code>

<code>        </code><code>self</code><code>.stdout.write(string.lower(s))</code>

<code># redirect standard output (including the print statement)</code>

<code># 重定向标準輸出(包括print語句)</code>

<code>old_stdout</code><code>=</code> <code>sys.stdout</code>

<code>sys.stdout</code><code>=</code> <code>redirect(sys.stdout)</code>

<code>print</code> <code>"heja sverige"</code><code>,</code>

<code>print</code> <code>"friskt hum\303\226r"</code>

<code># restore standard output</code>

<code># 恢複标準輸出</code>

<code>sys.stdout</code><code>=</code> <code>old_stdout</code>

<code>print</code> <code>"m\303\205\303\205\303\205\303\205l!"</code>

<code>heja sverige friskt hum\</code><code>303</code><code>\</code><code>266r</code>

<code>m\</code><code>303</code><code>\</code><code>205</code><code>\</code><code>303</code><code>\</code><code>205</code><code>\</code><code>303</code><code>\</code><code>205</code><code>\</code><code>303</code><code>\</code><code>205l</code><code>!</code>

  

<code>print</code> <code>"hello"</code>

<code>sys.exit(</code><code>1</code><code>)</code>

<code>print</code> <code>"there"</code>

<code>hello</code>

  注意 <code>sys.exit</code> 并不是立即退出. 而是引發一個 systemexit 異常. 這意味着你可以在主程式中捕獲對 <code>sys.exit</code> 的調用

<code>try</code><code>:</code>

<code>    </code><code>sys.exit(</code><code>1</code><code>)</code>

<code>except</code> <code>systemexit:</code>

<code>    </code><code>pass</code>

<code>there</code>

  如果準備在退出前自己清理一些東西(比如删除臨時檔案), 你可以配置一個 "退出處理函數"(exit handler), 它将在程式退出的時候自動被調用

<code>def</code> <code>exitfunc():</code>

<code>    </code><code>print</code> <code>"world"</code>

<code>sys.exitfunc</code><code>=</code> <code>exitfunc</code>

<code>print</code> <code>"there"</code> <code># never printed # 不會被 print</code>

<code>world</code>

  在 python 2.0 以後, 你可以使用 <code>atexit</code> 子產品來注冊多個退出處理函數.

 <code>atexit</code> 子產品允許你注冊一個或多個終止函數(暫且這麼叫), 這些函數将在解釋器終止前被自動調用.

調用 <code>register</code> 函數, 便可以将函數注冊為終止函數,你也可以添加更多的參數, 這些将作為 <code>exit</code> 函數的參數傳遞.

<code>import</code> <code>atexit</code>

<code>def</code> <code>exit(</code><code>*</code><code>args):</code>

<code>    </code><code>print</code> <code>"exit"</code><code>, args</code>

<code># register two exit handler</code>

<code>atexit.register(exit)</code>

<code>atexit.register(exit,</code><code>1</code><code>)</code>

<code>atexit.register(exit,</code><code>"hello"</code><code>,</code><code>"world"</code><code>)</code>

<code>exit (</code><code>'hello'</code><code>,</code><code>'world'</code><code>)</code>

<code>exit (</code><code>1</code><code>,)</code>

<code>exit ()</code>

<code>time</code> 子產品提供了一些處理日期和一天内時間的函數. 它是建立在 c 運作時庫的簡單封裝.

給定的日期和時間可以被表示為浮點型(從參考時間, 通常是 1970.1.1 到現在經過的秒數. 即 unix 格式), 或者一個表示時間的 struct (類元組).

<code>import</code> <code>time</code>

<code>now</code><code>=</code> <code>time.time()</code>

<code>print</code> <code>now,</code><code>"seconds since"</code><code>, time.gmtime(</code><code>0</code><code>)[:</code><code>6</code><code>]</code>

<code>print</code>

<code>print</code> <code>"or in other words:"</code>

<code>print</code> <code>"- local time:"</code><code>, time.localtime(now)</code>

<code>print</code> <code>"- utc:"</code><code>, time.gmtime(now)</code>

<code>937758359.77</code> <code>seconds since (</code><code>1970</code><code>,</code><code>1</code><code>,</code><code>1</code><code>,</code><code>0</code><code>,</code><code>0</code><code>,</code><code>0</code><code>)</code>

<code>or</code> <code>in</code> <code>other words:</code>

<code>-</code> <code>local time: (</code><code>1999</code><code>,</code><code>9</code><code>,</code><code>19</code><code>,</code><code>18</code><code>,</code><code>25</code><code>,</code><code>59</code><code>,</code><code>6</code><code>,</code><code>262</code><code>,</code><code>1</code><code>)</code>

<code>-</code> <code>utc: (</code><code>1999</code><code>,</code><code>9</code><code>,</code><code>19</code><code>,</code><code>16</code><code>,</code><code>25</code><code>,</code><code>59</code><code>,</code><code>6</code><code>,</code><code>262</code><code>,</code><code>0</code><code>)</code>

<code>now</code><code>=</code> <code>time.localtime(time.time())</code>

<code>print</code> <code>time.asctime(now)</code>

<code>print</code> <code>time.strftime(</code><code>"%y/%m/%d %h:%m"</code><code>, now)</code>

<code>print</code> <code>time.strftime(</code><code>"%a %b %d"</code><code>, now)</code>

<code>print</code> <code>time.strftime(</code><code>"%c"</code><code>, now)</code>

<code>print</code> <code>time.strftime(</code><code>"%i %p"</code><code>, now)</code>

<code>print</code> <code>time.strftime(</code><code>"%y-%m-%d %h:%m:%s %z"</code><code>, now)</code>

<code># do it by hand...</code>

<code>year, month, day, hour, minute, second, weekday, yearday, daylight</code><code>=</code> <code>now</code>

<code>print</code> <code>"%04d-%02d-%02d"</code> <code>%</code> <code>(year, month, day)</code>

<code>print</code> <code>"%02d:%02d:%02d"</code> <code>%</code> <code>(hour, minute, second)</code>

<code>print</code> <code>(</code><code>"mon"</code><code>,</code><code>"tue"</code><code>,</code><code>"wed"</code><code>,</code><code>"thu"</code><code>,</code><code>"fri"</code><code>,</code><code>"sat"</code><code>,</code><code>"sun"</code><code>)[weekday], yearday</code>

<code>sun</code><code>oct</code> <code>10</code> <code>21</code><code>:</code><code>39</code><code>:</code><code>24</code> <code>1999</code>

<code>99</code><code>/</code><code>10</code><code>/</code><code>10</code> <code>21</code><code>:</code><code>39</code>

<code>sun</code><code>oct</code> <code>10</code>

<code>09</code> <code>pm</code>

<code>1999</code><code>-</code><code>10</code><code>-</code><code>10</code> <code>21</code><code>:</code><code>39</code><code>:</code><code>24</code> <code>cest</code>

<code>1999</code><code>-</code><code>10</code><code>-</code><code>10</code>

<code>21</code><code>:</code><code>39</code><code>:</code><code>24</code>

<code>sun</code><code>283</code>

  在一些平台上, <code>time</code> 子產品包含了 <code>strptime</code> 函數, 它的作用與 <code>strftime</code> 相反. 給定一個字元串和模式, 它傳回相應的時間對象

<code># make sure we have a strptime function!</code>

<code># 确認有函數 strptime</code>

<code>    </code><code>strptime</code><code>=</code> <code>time.strptime</code>

<code>except</code> <code>attributeerror:</code>

<code>    </code><code>from</code> <code>strptime</code><code>import</code> <code>strptime</code>

<code>print</code> <code>strptime(</code><code>"31 nov 00"</code><code>,</code><code>"%d %b %y"</code><code>)</code>

<code>print</code> <code>strptime(</code><code>"1 jan 70 1:30pm"</code><code>,</code><code>"%d %b %y %i:%m%p"</code><code>)</code>

<code>import</code> <code>re</code>

<code>months</code><code>=</code> <code>[</code><code>"jan"</code><code>,</code><code>"feb"</code><code>,</code><code>"mar"</code><code>,</code><code>"apr"</code><code>,</code><code>"may"</code><code>,</code><code>"jun"</code><code>,</code><code>"jul"</code><code>,</code><code>"aug"</code><code>,</code>

<code>          </code><code>"sep"</code><code>,</code><code>"oct"</code><code>,</code><code>"nov"</code><code>,</code><code>"dec"</code><code>]</code>

<code>spec</code><code>=</code> <code>{</code>

<code>    </code><code># map formatting code to a regular expression fragment</code>

<code>    </code><code>"%a"</code><code>:</code><code>"(?p&lt;weekday&gt;[a-z]+)"</code><code>,</code>

<code>    </code><code>"%b"</code><code>:</code><code>"(?p&lt;month&gt;[a-z]+)"</code><code>,</code>

<code>    </code><code>"%c"</code><code>:</code><code>"(?p&lt;century&gt;\d\d?)"</code><code>,</code>

<code>    </code><code>"%d"</code><code>:</code><code>"(?p&lt;day&gt;\d\d?)"</code><code>,</code>

<code>    </code><code>"%d"</code><code>:</code><code>"(?p&lt;month&gt;\d\d?)/(?p&lt;day&gt;\d\d?)/(?p&lt;year&gt;\d\d)"</code><code>,</code>

<code>    </code><code>"%e"</code><code>:</code><code>"(?p&lt;day&gt;\d\d?)"</code><code>,</code>

<code>    </code><code>"%h"</code><code>:</code><code>"(?p&lt;month&gt;[a-z]+)"</code><code>,</code>

<code>    </code><code>"%h"</code><code>:</code><code>"(?p&lt;hour&gt;\d\d?)"</code><code>,</code>

<code>    </code><code>"%i"</code><code>:</code><code>"(?p&lt;hour12&gt;\d\d?)"</code><code>,</code>

<code>    </code><code>"%j"</code><code>:</code><code>"(?p&lt;yearday&gt;\d\d?\d?)"</code><code>,</code>

<code>    </code><code>"%m"</code><code>:</code><code>"(?p&lt;month&gt;\d\d?)"</code><code>,</code>

<code>    </code><code>"%m"</code><code>:</code><code>"(?p&lt;minute&gt;\d\d?)"</code><code>,</code>

<code>    </code><code>"%p"</code><code>:</code><code>"(?p&lt;ampm12&gt;am|pm)"</code><code>,</code>

<code>    </code><code>"%r"</code><code>:</code><code>"(?p&lt;hour&gt;\d\d?):(?p&lt;minute&gt;\d\d?)"</code><code>,</code>

<code>    </code><code>"%s"</code><code>:</code><code>"(?p&lt;second&gt;\d\d?)"</code><code>,</code>

<code>    </code><code>"%t"</code><code>:</code><code>"(?p&lt;hour&gt;\d\d?):(?p&lt;minute&gt;\d\d?):(?p&lt;second&gt;\d\d?)"</code><code>,</code>

<code>    </code><code>"%u"</code><code>:</code><code>"(?p&lt;week&gt;\d\d)"</code><code>,</code>

<code>    </code><code>"%w"</code><code>:</code><code>"(?p&lt;weekday&gt;\d)"</code><code>,</code>

<code>    </code><code>"%w"</code><code>:</code><code>"(?p&lt;weekday&gt;\d\d)"</code><code>,</code>

<code>    </code><code>"%y"</code><code>:</code><code>"(?p&lt;year&gt;\d\d)"</code><code>,</code>

<code>    </code><code>"%y"</code><code>:</code><code>"(?p&lt;year&gt;\d\d\d\d)"</code><code>,</code>

<code>    </code><code>"%%"</code><code>:</code><code>"%"</code>

<code>}</code>

<code>class</code> <code>timeparser:</code>

<code>    </code><code>def</code> <code>_ _init_ _(</code><code>self</code><code>,</code><code>format</code><code>):</code>

<code>        </code><code># convert strptime format string to regular expression</code>

<code>        </code><code>format</code> <code>=</code> <code>string.join(re.split(</code><code>"(?:\s|%t|%n)+"</code><code>,</code><code>format</code><code>))</code>

<code>        </code><code>pattern</code><code>=</code> <code>[]</code>

<code>        </code><code>try</code><code>:</code>

<code>            </code><code>for</code> <code>spec</code><code>in</code> <code>re.findall(</code><code>"%\w|%%|."</code><code>,</code><code>format</code><code>):</code>

<code>                </code><code>if</code> <code>spec[</code><code>0</code><code>]</code><code>=</code><code>=</code> <code>"%"</code><code>:</code>

<code>                    </code><code>spec</code><code>=</code> <code>spec[spec]</code>

<code>                </code><code>pattern.append(spec)</code>

<code>        </code><code>except</code> <code>keyerror:</code>

<code>            </code><code>raise</code> <code>valueerror,</code><code>"unknown specificer: %s"</code> <code>%</code> <code>spec</code>

<code>        </code><code>self</code><code>.pattern</code><code>=</code> <code>re.</code><code>compile</code><code>(</code><code>"(?i)"</code> <code>+</code> <code>string.join(pattern, ""))</code>

<code>    </code><code>def</code> <code>match(</code><code>self</code><code>, daytime):</code>

<code>        </code><code># match time string</code>

<code>        </code><code>match</code><code>=</code> <code>self</code><code>.pattern.match(daytime)</code>

<code>        </code><code>if</code> <code>not</code> <code>match:</code>

<code>            </code><code>raise</code> <code>valueerror,</code><code>"format mismatch"</code>

<code>        </code><code>get</code><code>=</code> <code>match.groupdict().get</code>

<code>        </code><code>tm</code><code>=</code> <code>[</code><code>0</code><code>]</code><code>*</code> <code>9</code>

<code>        </code><code># extract date elements</code>

<code>        </code><code>y</code><code>=</code> <code>get(</code><code>"year"</code><code>)</code>

<code>        </code><code>if</code> <code>y:</code>

<code>            </code><code>y</code><code>=</code> <code>int</code><code>(y)</code>

<code>            </code><code>if</code> <code>y &lt;</code><code>68</code><code>:</code>

<code>                </code><code>y</code><code>=</code> <code>2000</code> <code>+</code> <code>y</code>

<code>            </code><code>elif</code> <code>y &lt;</code><code>100</code><code>:</code>

<code>                </code><code>y</code><code>=</code> <code>1900</code> <code>+</code> <code>y</code>

<code>            </code><code>tm[</code><code>0</code><code>]</code><code>=</code> <code>y</code>

<code>        </code><code>m</code><code>=</code> <code>get(</code><code>"month"</code><code>)</code>

<code>        </code><code>if</code> <code>m:</code>

<code>            </code><code>if</code> <code>m</code><code>in</code> <code>months:</code>

<code>                </code><code>m</code><code>=</code> <code>months.index(m)</code><code>+</code> <code>1</code>

<code>            </code><code>tm[</code><code>1</code><code>]</code><code>=</code> <code>int</code><code>(m)</code>

<code>        </code><code>d</code><code>=</code> <code>get(</code><code>"day"</code><code>)</code>

<code>        </code><code>if</code> <code>d: tm[</code><code>2</code><code>]</code><code>=</code> <code>int</code><code>(d)</code>

<code>        </code><code># extract time elements</code>

<code>        </code><code>h</code><code>=</code> <code>get(</code><code>"hour"</code><code>)</code>

<code>        </code><code>if</code> <code>h:</code>

<code>            </code><code>tm[</code><code>3</code><code>]</code><code>=</code> <code>int</code><code>(h)</code>

<code>        </code><code>else</code><code>:</code>

<code>            </code><code>h</code><code>=</code> <code>get(</code><code>"hour12"</code><code>)</code>

<code>            </code><code>if</code> <code>h:</code>

<code>                </code><code>h</code><code>=</code> <code>int</code><code>(h)</code>

<code>                </code><code>if</code> <code>string.lower(get(</code><code>"ampm12"</code><code>, "</code><code>")) == "</code><code>pm":</code>

<code>                    </code><code>h</code><code>=</code> <code>h</code><code>+</code> <code>12</code>

<code>                </code><code>tm[</code><code>3</code><code>]</code><code>=</code> <code>h</code>

<code>        </code><code>m</code><code>=</code> <code>get(</code><code>"minute"</code><code>)</code>

<code>        </code><code>if</code> <code>m: tm[</code><code>4</code><code>]</code><code>=</code> <code>int</code><code>(m)</code>

<code>        </code><code>s</code><code>=</code> <code>get(</code><code>"second"</code><code>)</code>

<code>        </code><code>if</code> <code>s: tm[</code><code>5</code><code>]</code><code>=</code> <code>int</code><code>(s)</code>

<code>        </code><code># ignore weekday/yearday for now</code>

<code>        </code><code>return</code> <code>tuple</code><code>(tm)</code>

<code>def</code> <code>strptime(string,</code><code>format</code><code>=</code><code>"%a %b %d %h:%m:%s %y"</code><code>):</code>

<code>    </code><code>return</code> <code>timeparser(</code><code>format</code><code>).match(string)</code>

<code>if</code> <code>_ _name_ _</code><code>=</code><code>=</code> <code>"_ _main_ _"</code><code>:</code>

<code>    </code><code># try it out</code>

<code>    </code><code>import</code> <code>time</code>

<code>    </code><code>print</code> <code>strptime(</code><code>"2000-12-20 01:02:03"</code><code>,</code><code>"%y-%m-%d %h:%m:%s"</code><code>)</code>

<code>    </code><code>print</code> <code>strptime(time.ctime(time.time()))</code>

<code>(</code><code>2000</code><code>,</code><code>12</code><code>,</code><code>20</code><code>,</code><code>1</code><code>,</code><code>2</code><code>,</code><code>3</code><code>,</code><code>0</code><code>,</code><code>0</code><code>,</code><code>0</code><code>)</code>

<code>(</code><code>2000</code><code>,</code><code>11</code><code>,</code><code>15</code><code>,</code><code>12</code><code>,</code><code>30</code><code>,</code><code>45</code><code>,</code><code>0</code><code>,</code><code>0</code><code>,</code><code>0</code><code>)</code>

<code>t0</code><code>=</code> <code>time.time()</code>

<code>tm</code><code>=</code> <code>time.localtime(t0)</code>

<code>print</code> <code>tm</code>

<code>print</code> <code>t0</code>

<code>print</code> <code>time.mktime(tm)</code>

<code>(</code><code>1999</code><code>,</code><code>9</code><code>,</code><code>9</code><code>,</code><code>0</code><code>,</code><code>11</code><code>,</code><code>8</code><code>,</code><code>3</code><code>,</code><code>252</code><code>,</code><code>1</code><code>)</code>

<code>936828668.16</code>

<code>936828668.0</code>

<code>def</code> <code>_d(y, m, d, days</code><code>=</code><code>(</code><code>0</code><code>,</code><code>31</code><code>,</code><code>59</code><code>,</code><code>90</code><code>,</code><code>120</code><code>,</code><code>151</code><code>,</code><code>181</code><code>,</code><code>212</code><code>,</code><code>243</code><code>,</code><code>273</code><code>,</code><code>304</code><code>,</code><code>334</code><code>,</code><code>365</code><code>)):</code>

<code>    </code><code># map a date to the number of days from a reference point</code>

<code>    </code><code>return</code> <code>(((y</code><code>-</code> <code>1901</code><code>)</code><code>*</code><code>1461</code><code>)</code><code>/</code><code>4</code> <code>+</code> <code>days[m</code><code>-</code><code>1</code><code>]</code><code>+</code> <code>d</code><code>+</code>

<code>        </code><code>((m &gt;</code><code>2</code> <code>and</code> <code>not</code> <code>y</code><code>%</code> <code>4</code> <code>and</code> <code>(y</code><code>%</code> <code>100</code> <code>or</code> <code>not</code> <code>y</code><code>%</code> <code>400</code><code>))</code><code>and</code> <code>1</code><code>))</code>

<code>def</code> <code>timegm(tm, epoch</code><code>=</code><code>_d(</code><code>1970</code><code>,</code><code>1</code><code>,</code><code>1</code><code>)):</code>

<code>    </code><code>year, month, day, h, m, s</code><code>=</code> <code>tm[:</code><code>6</code><code>]</code>

<code>    </code><code>assert</code> <code>year &gt;</code><code>=</code> <code>1970</code>

<code>    </code><code>assert</code> <code>1</code> <code>&lt;</code><code>=</code> <code>month &lt;</code><code>=</code> <code>12</code>

<code>    </code><code>return</code> <code>(_d(year, month, day)</code><code>-</code> <code>epoch)</code><code>*</code><code>86400</code> <code>+</code> <code>h</code><code>*</code><code>3600</code> <code>+</code> <code>m</code><code>*</code><code>60</code> <code>+</code> <code>s</code>

<code>tm</code><code>=</code> <code>time.gmtime(t0)</code>

<code>print</code> <code>timegm(tm)</code>

<code>(</code><code>1999</code><code>,</code><code>9</code><code>,</code><code>8</code><code>,</code><code>22</code><code>,</code><code>12</code><code>,</code><code>12</code><code>,</code><code>2</code><code>,</code><code>251</code><code>,</code><code>0</code><code>)</code>

<code>936828732.48</code>

<code>936828732</code>

<code>def</code> <code>procedure():</code>

<code>    </code><code>time.sleep(</code><code>2.5</code><code>)</code>

<code># measure process time</code>

<code>t0</code><code>=</code> <code>time.clock()</code>

<code>procedure()</code>

<code>print</code> <code>time.clock()</code><code>-</code> <code>t0,</code><code>"seconds process time"</code>

<code># measure wall time</code>

<code>print</code> <code>time.time()</code><code>-</code> <code>t0,</code><code>"seconds wall time"</code>

<code>0.0</code> <code>seconds process time</code>

<code>2.50903499126</code> <code>seconds wall time</code>

<code>import</code> <code>types</code>

<code>def</code> <code>check(</code><code>object</code><code>):</code>

<code>    </code><code>print</code> <code>object</code><code>,</code>

<code>    </code><code>if</code> <code>type</code><code>(</code><code>object</code><code>)</code><code>is</code> <code>types.inttype:</code>

<code>        </code><code>print</code> <code>"integer"</code><code>,</code>

<code>    </code><code>if</code> <code>type</code><code>(</code><code>object</code><code>)</code><code>is</code> <code>types.floattype:</code>

<code>        </code><code>print</code> <code>"float"</code><code>,</code>

<code>    </code><code>if</code> <code>type</code><code>(</code><code>object</code><code>)</code><code>is</code> <code>types.stringtype:</code>

<code>        </code><code>print</code> <code>"string"</code><code>,</code>

<code>    </code><code>if</code> <code>type</code><code>(</code><code>object</code><code>)</code><code>is</code> <code>types.classtype:</code>

<code>        </code><code>print</code> <code>"class"</code><code>,</code>

<code>    </code><code>if</code> <code>type</code><code>(</code><code>object</code><code>)</code><code>is</code> <code>types.instancetype:</code>

<code>        </code><code>print</code> <code>"instance"</code><code>,</code>

<code>    </code><code>print</code>

<code>check(</code><code>0</code><code>)</code>

<code>check(</code><code>0.0</code><code>)</code>

<code>check(</code><code>"0"</code><code>)</code>

<code>class</code> <code>a:</code>

<code>class</code> <code>b:</code>

<code>check(a)</code>

<code>check(b)</code>

<code>a</code><code>=</code> <code>a()</code>

<code>b</code><code>=</code> <code>b()</code>

<code>0</code> <code>integer</code>

<code>0.0</code> <code>float</code>

<code>0</code> <code>string</code>

<code>a class</code>

<code>b class</code>

<code>&lt;a instance at</code><code>796960</code><code>&gt; instance</code>

<code>&lt;b instance at</code><code>796990</code><code>&gt; instance</code>

<code>import</code> <code>gc</code>

<code># create a simple object that links to itself</code>

<code>class</code> <code>node:</code>

<code>    </code><code>def</code> <code>_ _init_ _(</code><code>self</code><code>, name):</code>

<code>        </code><code>self</code><code>.name</code><code>=</code> <code>name</code>

<code>        </code><code>self</code><code>.parent</code><code>=</code> <code>none</code>

<code>        </code><code>self</code><code>.children</code><code>=</code> <code>[]</code>

<code>    </code><code>def</code> <code>addchild(</code><code>self</code><code>, node):</code>

<code>        </code><code>node.parent</code><code>=</code> <code>self</code>

<code>        </code><code>self</code><code>.children.append(node)</code>

<code>    </code><code>def</code> <code>_ _repr_ _(</code><code>self</code><code>):</code>

<code>        </code><code>return</code> <code>"&lt;node %s at %x&gt;"</code> <code>%</code> <code>(</code><code>repr</code><code>(</code><code>self</code><code>.name),</code><code>id</code><code>(</code><code>self</code><code>))</code>

<code># set up a self-referencing structure</code>

<code>root</code><code>=</code> <code>node(</code><code>"monty"</code><code>)</code>

<code>root.addchild(node(</code><code>"eric"</code><code>))</code>

<code>root.addchild(node(</code><code>"john"</code><code>))</code>

<code>root.addchild(node(</code><code>"michael"</code><code>))</code>

<code># remove our only reference</code>

<code>del</code> <code>root</code>

<code>print</code> <code>gc.collect(),</code><code>"unreachable objects"</code>

<code>12</code> <code>unreachable objects</code>

<code>0</code> <code>unreachable objects</code>