调试隐式调用 IPython.display 的 VSCode .ipynb 单元会引发 AttributeError

问题描述 投票:0回答:1

我的 C 类覆盖了

__getattr__

在我的

.ipynb
细胞中,我做
c = C() ; c

如果我运行这个单元格,它就会起作用。但如果我调试它,我现在会遇到

AttributeError
异常。

如何处理这个问题?

PS交叉引用:

PPS 我将尝试在下面回答我自己的问题。

visual-studio-code debugging ipython attributeerror
1个回答
0
投票

我怀疑

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 异常,现在符合“用户未捕获异常”的条件。

看来我的选择是:

  1. 不加价返回(
    if k.startswith('_'): return
    )。这感觉很粗略,因为 IPython.display 很可能被剥夺了它所希望的 AttributeError 异常(如果我猜测这确实是正确的),
  2. 使用
    print
    语句,这样
    IPython.display
    就不会被调用,或者:
  3. 在 VSCode 调试器窗格的断点选项卡中取消选中“引发的异常”和“用户未捕获的异常”,在这种情况下我可以
    raise
    或回退。

我暂时怀疑正确的路径是:

    def __getattr__(self, k):
        if k.startswith('_'):
            return
© www.soinside.com 2019 - 2024. All rights reserved.