如何覆盖ipython displayhook?
我已经定义了自己的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]:和…:部分. 最后,为了改变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) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |