[IPython-dev] messaging protocol

Robert Kern robert.kern at gmail.com
Sun Apr 10 02:18:33 EDT 2011

On 2011-04-10 01:06 , Brian Granger wrote:
> On Fri, Apr 8, 2011 at 2:05 PM, Robert Kern<robert.kern at gmail.com>  wrote:
>> On 4/8/11 3:32 PM, Fernando Perez wrote:
>>> On Fri, Apr 8, 2011 at 1:21 PM, Thomas Kluyver<takowl at gmail.com>    wrote:
>>>> In fact, now that we're using AST instead of code blocks, we could actually
>>>> do what you suggest. We could check the last node, and only run it
>>>> interactively if it was a single expression. Whether or not that's what we
>>>> want to do, I don't know: any views?
>>> That's a very good point.  The fragile heuristics we had were
>>> precisely because we lacked this information.  But I really do like
>>> this suggestion, because I think it provides the most intuitive
>>> semantics.  Things like:
>>> for i in range(10):
>>>     plot(foo[i])
>>> won't produce 10 different Out[] outputs, and yet any last-block
>>> expression, even if it contains some multline string or other complex
>>> formatting that makes it be more than one *line of text* will still be
>>> executed interactively, yielding just one result.
>>> I'm very much +1 on this idea.  Big benefit of your recent tackling
>>> inputsplitter!! Awesome.
>> I don't think we need to solve this in the splitter. You can do everything you
>> need to do in the display trap. The logic is very simple. The display trap sets
>> the displayhook before the code In[N] is executed. Every time the displayhook
>> gets called during this execution, the display trap records the object and its
>> formatted representation, overwriting whatever was there. Once the execution is
>> done, *then* the formatted representation is given to the reply message (or
>> printed if in the terminal frontend) and the history DB (if it is storing
>> outputs), and the object is shoved into Out[N]. Then the display trap is cleared
>> before In[N+1] is executed.
> This is a good point that is worth investigating.  The only hitch is
> that the formatted representation is not sent in the reply to the
> original code execution request.  It is published over the PUB socket,
> which makes sure that gets sent to all frontends.  This means that the
> display hook data can be sent out to all frontends *before* the
> execute reply message goes back.  But we might still be able to get
> this to work.  It is attractive because it would be this logic out of
> the splitter, where it seems a bit out of place.

Replace "reply message" with "displayhook PUB message" in what I wrote. You just 
need to explicitly tell the DisplayHook when to actually send the message/print 
the repr in the actual execution cycle. It should not do it on every __call__. 
That's all. That was the design I had in the ipwx prototype way back when.

Robert Kern

"I have come to believe that the whole world is an enigma, a harmless enigma
  that is made terrible by our own mad attempt to interpret it as though it had
  an underlying truth."
   -- Umberto Eco

More information about the IPython-dev mailing list