我正在try 在Python类(docs)上实现_repr_html_
.
该类是一个只读外观,用于使用属性符号导航类似于Python的对象(基于Fluent Python,Rahmalho(O ' Reilly)的示例19-5).它有一个自定义的__getatrr__
方法来实现此行为:
from collections import abc
class FrozenJSON:
def __init__(self, mapping):
self._data = dict(mapping)
def __repr__(self):
return "FrozenJSON({})".format(repr(self._data))
def _repr_html_(self):
return (
"<ul>"
+ "\n".join(
f"<li><strong>{k}:</strong> {v}</li>"
for k, v in self._data.items()
)
+ "</ul>"
)
def __getattr__(self, name):
if hasattr(self._data, name):
return getattr(self._data, name)
else:
return FrozenJSON.build(self._data[name])
@classmethod
def build(cls, obj):
if isinstance(obj, abc.Mapping):
return cls(obj)
elif isinstance(obj, abc.MutableSequence):
return [cls.build(item) for item in obj]
else:
return obj
def __dir__(self):
return list(self._data.keys())
类的行为如下:
>>> record = FrozenJSON({"name": "waldo", "age": 32, "occupation": "lost"})
>>> record.occupation
'lost'
然而,_repr_html_
不会在IPython环境中显示(我try 过vscode和jupyter实验室).
注释掉__getattr__
方法会导致显示HTML表示形式,所以我相当确信这个问题与此有关.
(在我的环境中,其他对象上的_repr_html_
可以很好地工作(例如pandas DataFrames).)
以下内容没有帮助:
def __getattr__(self, name):
if hasattr(self._data, name):
return getattr(self._data, name)
elif name == "_repr_html_":
return self._repr_html_
else:
return FrozenJSON.build(self._data[name])
我不太了解vscode / juptyer实验室如何知道呼叫_repr_html_
而不是__repr__
,以及这个__getattr__
如何打破这一点.
提前感谢任何帮助!