Search code examples
pythonpython-typingmethod-chaining

How to annotate a Python3 method that returns self?


Function Annotations: PEP-3107

Background: I am PyCharm user w/CPython 3.4x on Linux. I find it helps to annotate function parameters and return types. The IDE can better hint when I use these methods.

Question: For self-chaining methods, how can I annotate the method return value? If I use the class name, Python throws an exception at compile time: NameError: name 'X' is not defined

Sample code:

class X:
    def yaya(self, x: int):
        # Do stuff here
        pass

    def chained_yaya(self, x: int) -> X:
        # Do stuff here
        return self

As a trick, if I put X = None just before the class declaration, it works. However, I don't know if there are unforseen, negative side effects from this technique.


Solution

  • As of Python 3.11, you will be able to use Self to annotate the return type:

    from typing import Self
    
    
    class X:
        def yaya(self, x: int):
            # Do stuff here
            pass
    
        def chained_yaya(self, x: int) -> Self:
            # Do stuff here
            return self