sphinx-immaterial icon indicating copy to clipboard operation
sphinx-immaterial copied to clipboard

Specifying return type for inherited function

Open jat255 opened this issue 1 year ago • 2 comments

I have a basic inherited class structure that looks more or less like this, with some methods in the base class that return objects of the same type:

from typing import Self

class A(SomeOtherBaseClass):
    ...
    
    def method_1(self) -> Self:
        modified_copy = self.deepcopy()
        return modified_copy
    
    def method_2(self) -> Self:
        modified_copy = self.deepcopy()
        return modified_copy
    ...

class B(A):
    def sub_class_method_b():
        ...

class C(A):
    def sub_class_method_c():
        ...

To type hint the methods in class A, I've specified the return type as typing.Self, which works fine in my editor. When building the docs using python-apigen, the entity pages for classes B and C look something like this:

image

I have also tried type-hinting with the name of the parent class, like this:

class A(SomeOtherBaseClass):
    ...
    
    def method_1(self) -> "A":
        modified_copy = self.deepcopy()
        return modified_copy
    
    def method_2(self) -> "A":
        modified_copy = self.deepcopy()
        return modified_copy
    ...

class B(A):
    def sub_class_method_b():
        ...

class C(A):
    def sub_class_method_c():
        ...

That also works in my editor, but results in incorrect documentation pages, that show the methods always return an object of class A, even on the pages for class B and C:

image

Ideally, the correct interpretation would be that those methods would return type B on the B page, and C on the C page. Is there anyway to configure things so this is the output?

jat255 avatar Oct 02 '24 22:10 jat255

There isn't currently an option to do that, but it could potentially be implemented similar to how type parameters of inherited methods are also resolved.

Arguably Self is useful to display if the user might inherit from the class. If users aren't expected to inherit from the class then just showing the resolved return type could make sense.

jbms avatar Oct 03 '24 06:10 jbms

Ok, thanks for the context. Feel free to leave this open as a feature request, or close it if you wish. It would be nice if it worked the way I mentioned, but far from a deal-breaker on how useful this theme is!

jat255 avatar Oct 11 '24 15:10 jat255