title: Is there any benefit to annotating `self` or `cls` in Python methods?
body: <p>As explained in <a href="https://peps.python.org/pep-0673/" rel="nofollow noreferrer">PEP-673</a>, the current (Python 3.10) correct way to add a type annotation to <code>self</code> is somewhat verbose:</p>
  <pre><code>from typing import TypeVar
  
  TShape = TypeVar(&quot;TShape&quot;, bound=&quot;Shape&quot;)
  
  class Shape:
      def set_scale(self: TShape, scale: float) -&gt; TShape:
          self.scale = scale
          return self
  </code></pre>
  <p>It's clear to me why the <code>TypeVar</code> is needed for methods that return instances of their own class. In this example, <code>set_scale()</code> needs to be annotated <code>-&gt; TShape</code> for linters to understand it may return an instance of specific subclass of <code>Shape</code>, not simply instances of <code>Shape</code>.</p>
  <p>It's fairly common, though, for a class to have no use for a <code>TypeVar</code> other than annotating the <code>self</code> parameter to methods. Anecdotally, linters (mypy and Pylance) seem to have no issue inferring correct types if the annotation is left off in this case. The same seems to be true of <code>cls</code> inside classmethod definitions.</p>
  <p>In PEP-673, some of the examples omit any annotation of <code>self</code>, even after introducing the new, more convenient <code>Self</code> type of Python 3.11:</p>
  <pre><code>from typing import Self
  
  class Shape:
      def difference(self, other: Self) -&gt; float: ...
  
      def apply(self, f: Callable[[Self], None]) -&gt; None: ...
  
  </code></pre>
  <p>The PEP text notes that specifying <code>self: Self</code> in this example would be &quot;harmless&quot;, but doesn't clarify whether there's actually any benefit to doing so.</p>
  <p>Given the above, is there <em>any</em> reason to bother annotating <code>self</code> or <code>cls</code> in a method's parameter list? I'm considering switching to omitting these even when I have a defined <code>TypeVar</code> anyway for return types -- why bother if the types are obvious to both humans and linters?</p>