ObjA列表的自定义显示输出

时间:2015-08-12 09:54:41

标签: python ipython

我们可以使用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)

我想使用.for_type_by_name(...)方法为特定类型的列表注册自定义显示,比如说ObjA而不仅仅是ObjA本身的类型。

我该怎么做?

是的,我无法访问返回ObjA列表的类。

1 个答案:

答案 0 :(得分:0)

如何为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)

似乎格式化函数返回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

这是一个相当肮脏的黑客,但不幸的是我没有看到任何其他方式(除了猴子修补DisplayFormatter,这甚至更脏,虽然它应该更强大)。如果有的话,希望有人能够启发我们。