Python:VSCode 不显示继承异常的文档字符串

0 投票
1 回答
39 浏览
提问于 2025-04-14 15:44
class CustomNamedException(Exception):
    """Example docstring here."""

    def __init__(self, name) -> None:
        self._name = name

    def __str__(self):
        return("Error message.")

我上面提到的异常在VSCode中使用这个类时没有显示文档字符串,信息框里显示的却是 所有异常的公共基类

截图:

在这里输入图片描述

当我调用这个异常时,显示基类的文档字符串似乎有点多余,我希望能显示 这里是示例文档字符串。。我是不是漏掉了什么?

更新: 如果我给 __init__() 提供一个文档字符串,它就会显示出来:

在这里输入图片描述

这基本上是预期的行为吗?当你从BaseException类继承时,文档字符串会被忽略,除非你把它放在 __init__() 里吗?

1 个回答

0

我不能确定这是不是故意的,但我可以告诉你这个行为看起来是这样的:

class BaseClass:
    """BaseClass docstring"""
    def __init__():
        """BaseClass __init__ docstring"""
        pass
class DerivedClass(BaseClass):
    """DerivedClass docstring"""
    def __init__():
        """DerivedClass __init__ docstring""" # <-
        pass
DerivedClass() # DerivedClass __init__ docstring
class BaseClass:
    """BaseClass docstring"""
    def __init__():
        """BaseClass __init__ docstring""" # <-
        pass
class DerivedClass(BaseClass):
    """DerivedClass docstring"""
    def __init__():
        # """DerivedClass __init__ docstring""" # commented out
        pass
DerivedClass() # BaseClass __init__ docstring
class BaseClass:
    """BaseClass docstring"""
    def __init__():
        # """BaseClass __init__ docstring""" # commented out
        pass
class DerivedClass(BaseClass):
    """DerivedClass docstring""" # <-
    def __init__():
        # """DerivedClass __init__ docstring""" # commented out
        pass
DerivedClass() # DerivedClass docstring
class BaseClass:
    """BaseClass docstring"""
    def __init__():
        # """BaseClass __init__ docstring""" # commented out
        pass
class DerivedClass(BaseClass):
    # """DerivedClass docstring""" # commented out
    def __init__():
        # """DerivedClass __init__ docstring""" # commented out
        pass
DerivedClass() # N/A

其实并不是说它不显示派生类的文档字符串,而是它在找__init__这个方法的文档字符串。如果找不到,它会先看看基类的__init__文档字符串,如果有的话就用那个(在这个问题的例子中,确实有)。

我同意这可能会让人觉得有点奇怪,尤其是当派生类的构造函数和基类的构造函数差别很大时,这可能会引发一些问题。不过我觉得这并不是一个特别糟糕的设计,我能理解这样选择的原因。

撰写回答