The solution in my earlier post doesn't fly in zope3. To get it to work in zope3 I modified:
~/instances/z3/bin/debugzope
if __name__ == '__main__': db = startup()
del startup
from zope.app.debug import Debugger
debugger = app = Debugger.fromDatabase(db)
root = app.root()
del db
del Debugger
import IPython
IPython.Shell.IPShell(user_ns={'root': root,
'app': app,
'top' : app.root()
}).mainloop(sys_exit=1)
I haven't figured out much about how the debugger differs in Zope3. But it gives me top as app.root().
In [1]: print top.items()
<OOBTreeItems object at 0x355c598>
In [2]: app.root()['foo']
Out[2]: <zope.app.folder.folder.Folder object at 0x36dfef0>
In [3]: top
Out[3]: <zope.app.folder.folder.Folder object at 0x36a27f0>
In [4]: top['foo']
Out[4]: <zope.app.folder.folder.Folder object at 0x36df830>
In [5]: print [x for x in top.items()]
[(u'foo', <zope.app.folder.folder.Folder object at 0x36df830>)]