我的 C 类覆盖了
__getattr__
。
在我的
.ipynb
细胞中,我做c = C() ; c
如果我运行这个单元格,它就会起作用。但如果我调试它,我现在会遇到
AttributeError
异常。
如何处理这个问题?
PS交叉引用:
PPS 我将尝试在下面回答我自己的问题。
我怀疑
c
行会调用 IPython.display
来探测 IPython 添加的某些属性。
如果我们不重写
__getattr__
,我们就不会意识到这一点。
将它们转储出来(在我的“get_attr”覆盖顶部有一个
print(k)
):
_ipython_canary_method_should_not_exist_
_ipython_display_
_repr_mimebundle_
_repr_html_
_repr_markdown_
_repr_svg_
_repr_png_
_repr_pdf_
_repr_jpeg_
_repr_latex_
_repr_json_
_repr_javascript_
大概是由我的单行
IPython.display
调用的 c
,使用 try/except
检查这些属性是否存在并捕获 AttributeError
异常。
问题是现在我正在重写
__getattr__
,异常现在发生在在我的代码中!
因此,即使我捕获了这些访问 (
if k.startswith('_'): ...
),我是否:
(1) 尝试回退到 object.__getattribute__(self, k)
,或者:
(2)raise AttributeError
,
...抛出 AttributeError 异常,现在符合“用户未捕获异常”的条件。
看来我的选择是:
if k.startswith('_'): return
)。这感觉很粗略,因为 IPython.display 很可能被剥夺了它所希望的 AttributeError 异常(如果我猜测这确实是正确的),print
语句,这样 IPython.display
就不会被调用,或者:raise
或回退。我暂时怀疑正确的路径是:
def __getattr__(self, k):
if k.startswith('_'):
return