Never mind this, I figured out it was a slightly different issue that was causing the problem.<br><br>I *do* activate the displaytrap elsewhere, but my display trap context manager <br>wasn&#39;t fully reentrant so the trap was being turned off in the wrong place because of<br>
a recursive call to __enter__:<br><br>with trap:<br>    # do something<br>    with trap:<br>        # do something else<br>    # Opps trap is off now!<br>    # All subsequence code doesn&#39;t have the trap set.<br><br>Moral of the story:  if your context managers can be entered recursively, make sure<br>
you have logic that prevents this type of thing.  It is easy logic to add though.<br><br>Darren asks:<br><br><blockquote style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;" class="gmail_quote">
Can you do:<br><div class="im"><br>
with nested(self.builtin_trap, self.display_trap):<br>
</div>    return fn(magic_args)<br></blockquote>

<br>
Maybe so, I am not sure what the ordering of the return vs __exit__ call is in this case.<br>I will have to look this up.<br><br>Cheers,<br><br>Brian<br><br><br><br><br><div class="gmail_quote">On Fri, Sep 11, 2009 at 4:36 PM, Brian Granger <span dir="ltr">&lt;<a href="http://ellisonbg.net">ellisonbg.net</a>@<a href="http://gmail.com">gmail.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">Hi,<br><br>I am converting some of the traps in IPython to use the with statement.  The idea is that<br>
things like sys.excepthook, sys.displayhook, etc. are not always set by IPython,<br>but only when user code is actually being run.  But, I am running into a problem<br>
with sys.displayhook with the results of a magic function.<br><br>The prefilter machinery converts:<br><br>%alias -&gt; get_ipython().magic(&quot;alias&quot;)<br><br>The end of the get_ipython().magic function looks like this:<br>

<br>            with nested(self.builtin_trap, self.display_trap):<br>                result = fn(magic_args)<br>            return result<br><br>This idea is that we use &quot;with&quot; to enable the display_trap, call the <br>

magic and then return the result.  The builtin_trap works fine, but<br>the display_trap doesn&#39;t work.  The problem is that sys.displaytrap<br>is only called when something is returned.  But by then (&quot;return result&quot;)<br>

the &quot;with&quot; block has ended and the display_trap is deactivated.<br><br>There are other places that I can enable the display_trap, but we<br>loose the nice feature of only having the trap set when it is needed.<br>

<br>Any ideas of how we can get around having to leave display_trap set<br>all the time?<br><br>Cheers,<br><font color="#888888"><br>Brian<br>
</font></blockquote></div><br>