加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

如何覆盖ipython displayhook?

发布时间:2020-12-20 13:10:42 所属栏目:Python 来源:网络整理
导读:我已经定义了自己的displayhook,它继承自I Python.core.displayhook.DisplayHook. 我无法在网上找到任何资源来覆盖IPython shell的displayhook的正确方法.目前,我在?/ .ipython / profile_default / startup / imports.py中执行以下操作: ipyShell = IPytho
我已经定义了自己的displayhook,它继承自I Python.core.displayhook.DisplayHook.

我无法在网上找到任何资源来覆盖IPython shell的displayhook的正确方法.目前,我在?/ .ipython / profile_default / startup / imports.py中执行以下操作:

ipyShell = IPython.get_ipython()
ipyShell.displayhook = MyDisplayHook(shell=ipyShell)
ipyShell.displayhook_class = MyDisplayHook
sys.displayhook = ipyShell.displayhook

哪个不起作用,因为在ipython shell启动后,sys.displayhook以某种方式切换回常规的ipython显示钩子:

In [5]: print sys.displayhook
<IPython.core.displayhook.DisplayHook object at 0x7f1491853610>

谢谢.

解决方法

如果有人偶然发现(就像我做的那样),与标准的python displayhook相比,格式化IPython的方式实际上可能会产生误导.

在这个答案中,我首先尝试详细说明IPython的不同部分,然后在最后解决OP(和我的)的具体问题.

在IPython中,您可以自定义几乎所有内容,只使用远离标准python displayhook的方法.

IPython中所谓的“钩子”(参见doc和this example)实际上是一些旨在改变shell行为的东西.

或者可以改变编辑器的样子,即

In [5]: def foo():
   ...:     return 'foo'
   ...:

接口,特别是In [5]:和…:部分.
为此,您可以查看IPython doc以了解如何使用提示执行此操作.

最后,为了改变python对象输出的格式,我不得不使用IPython格式化程序(参见source code)和here定义的漂亮打印函数.

例如,如果要更改默认的dict格式

{'axon_angle': 305.010625458 degree,'observables': ['length','num_growth_cones'],'random_rotation_angles': True}

{
  'axon_angle'            : 305.010625458 degree,'observables'           : [
    'length','num_growth_cones',],'random_rotation_angles': True
}

你可以使用类似的东西

def dict_formatter(obj,p,cycle):
    if cycle:
        return p.text('{...}')
    start = '{'
    end   = '}'
    step = 2
    p.begin_group(step,start)
    keys = obj.keys()
    max_len = 0
    for k,v in obj.items():
        max_len = max(max_len,len(str(k)))

    if obj:
        p.breakable()
    for idx,key in p._enumerate(keys):
        if idx:
            p.text(',')
            p.breakable()
        p.pretty(key)
        wlen = max_len-len(str(key))
        p.text(' '*wlen + ': ')
        p.pretty(obj[key])
    if obj:
        p.end_group(step,'')
        p.breakable()
        p.text(end)
    else:
        p.end_group(step,end)

import IPython
ip = IPython.get_ipython()
formatter = ip.display_formatter.formatters['text/plain']
formatter.for_type(dict,dict_formatter)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读