我们可以使用ipython显示引擎为numpy.polynomial.polynomial注册一个自定义类型,如下所示
ip = get_ipython()
foramtter = ip.display_formatter.formatters['text/latex']
foramtter.for_type_by_name('numpy.polynomial.polynomial',
'Polynomial', display_func)
Run Code Online (Sandbox Code Playgroud)
我想使用.for_type_by_name(...)方法为特定类型的列表注册自定义显示,比如说ObjA而不仅仅是ObjA本身的类型.
我怎样才能做到这一点?
顺便说一句,我没有访问返回ObjA列表的类.
如何为list仅在看到 ObjA 列表时才起作用的对象创建一个格式化程序?
from decimal import Decimal # Decimal is my ObjA here
ip = get_ipython()
formatter = ip.display_formatter.formatters['text/latex']
def format_list(obj):
if not isinstance(obj, list):
return None
if not all(isinstance(item, Decimal) for item in obj):
return None
return "$$[%s]$$" % ";".join(map(str, obj))
formatter.for_type_by_name('builtins', 'list', format_list)
Run Code Online (Sandbox Code Playgroud)
似乎如果格式化函数返回None,则格式化程序将被忽略。至少它对我有用:
In[2]: [Decimal("1"), Decimal("2"), "not a decimal"]
Out[2]: [Decimal("1"), Decimal("2"), "not a decimal"]
In[3]: [Decimal("1"), Decimal("2")]
Out[3] 1, 2 # LaTeX-formatted, yeah
Run Code Online (Sandbox Code Playgroud)
这是一个相当肮脏的黑客,但不幸的是我没有看到任何其他方法(除了猴子补丁DisplayFormatter,它甚至更肮脏,尽管它应该更强大)。如果有的话希望有人赐教。