ObjA列表的自定义显示输出

iCo*_*ode 5 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)
Run Code Online (Sandbox Code Playgroud)

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

我怎样才能做到这一点?

顺便说一句,我没有访问返回ObjA列表的类.

drd*_*man 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)
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,它甚至更肮脏,尽管它应该更强大)。如果有的话希望有人赐教。