Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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.

like image 519
kevinarpe Avatar asked Nov 22 '22 08:11

kevinarpe


2 Answers

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
  • PEP 673
like image 67
Maximilian Burszley Avatar answered Nov 24 '22 20:11

Maximilian Burszley


You could do:

class X: 
    pass

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

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

In your code, X has not been defined until the class definition is complete.

Same problem here: putting current class as return type annotation

His solution was to use a string. In your code that would be -> 'X'

like image 39
doog abides Avatar answered Nov 24 '22 21:11

doog abides