如何重写ipythondisplayhook?

2024-10-03 02:42:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我定义了自己的displayhook,它继承自IPython.core.displayhook显示挂钩。在

我在网上找不到任何关于重写ipythonshell的displayhook的正确方法的资源。目前,我正在~/.ipython/profile_default/startup中执行以下操作/导入.py公司名称:

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

这不起作用,ipython shell启动后,系统显示挂钩以某种方式切换回常规的ipython显示挂钩:

^{pr2}$

谢谢。在


Tags: 方法pycoredefault定义ipython资源shell
1条回答
网友
1楼 · 发布于 2024-10-03 02:42:16

如果有人无意中发现了这一点(就像我所做的那样),与标准的python displayhook相比,IPython的格式化方式乍一看可能会产生误导。在

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

在IPython中,您可以定制几乎所有的东西,只使用与标准pythondisplayhook相去甚远的方法。在

IPython中所谓的“hooks”(参见docthis example)实际上是为了改变shell的行为。在

或者可以更改编辑器的外观,即

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

接口,特别是In [5]:...:部分。 为此,您可以查看一下IPython doc,看看如何使用Prompts来实现这一点。在

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

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

^{pr2}$

{
  '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)

相关问题 更多 >