Skip to content

Commit 2461eff

Browse files
committed
PEP 702 (@deprecated): "normal" overloaded methods
Fixes python#18474 It seems I covered overloaded functions, descriptors, and special methods so far but completely forgot about "normal" methods (thanks to @sobolevn for pointing this out). This addition should do the trick.
1 parent 8859d51 commit 2461eff

File tree

2 files changed

+47
-1
lines changed

2 files changed

+47
-1
lines changed

mypy/checkexpr.py

+8-1
Original file line numberDiff line numberDiff line change
@@ -1485,7 +1485,14 @@ def check_call_expr_with_callee_type(
14851485
)
14861486
proper_callee = get_proper_type(callee_type)
14871487
if isinstance(e.callee, (NameExpr, MemberExpr)):
1488-
self.chk.warn_deprecated_overload_item(e.callee.node, e, target=callee_type)
1488+
node = e.callee.node
1489+
if (node is None) and (member is not None) and isinstance(object_type, Instance) and (
1490+
(symbol := object_type.type.names.get(member)) is not None
1491+
):
1492+
node = symbol.node
1493+
self.chk.warn_deprecated_overload_item(
1494+
node, e, target=callee_type, selftype=object_type
1495+
)
14891496
if isinstance(e.callee, RefExpr) and isinstance(proper_callee, CallableType):
14901497
# Cache it for find_isinstance_check()
14911498
if proper_callee.type_guard is not None:

test-data/unit/check-deprecated.test

+39
Original file line numberDiff line numberDiff line change
@@ -377,6 +377,45 @@ for i in a: # E: function __main__.A.__iter__ is deprecated: no iteration
377377
[builtins fixtures/tuple.pyi]
378378

379379

380+
[case testDeprecatedOverloadedMethods]
381+
# flags: --enable-error-code=deprecated
382+
383+
from typing import Iterator, Union
384+
from typing_extensions import deprecated, overload
385+
386+
class A:
387+
@overload
388+
@deprecated("pass `str` instead")
389+
def f(self, v: int) -> None: ...
390+
@overload
391+
def f(self, v: str) -> None: ...
392+
def f(self, v: Union[int, str]) -> None: ...
393+
394+
@overload
395+
def g(self, v: int) -> None: ...
396+
@overload
397+
@deprecated("pass `int` instead")
398+
def g(self, v: str) -> None: ...
399+
def g(self, v: Union[int, str]) -> None: ...
400+
401+
@overload
402+
def h(self, v: int) -> A: ...
403+
@overload
404+
def h(self, v: str) -> A: ...
405+
@deprecated("use `h2` instead")
406+
def h(self, v: Union[int, str]) -> A: ...
407+
408+
a = A()
409+
a.f(1) # E: overload def (self: __main__.A, v: builtins.int) of function __main__.A.f is deprecated: pass `str` instead
410+
a.f("x")
411+
a.g(1)
412+
a.g("x") # E: overload def (self: __main__.A, v: builtins.str) of function __main__.A.g is deprecated: pass `int` instead
413+
a.h(1) # E: function __main__.A.h is deprecated: use `h2` instead
414+
a.h("x") # E: function __main__.A.h is deprecated: use `h2` instead
415+
416+
[builtins fixtures/tuple.pyi]
417+
418+
380419
[case testDeprecatedOverloadedSpecialMethods]
381420
# flags: --enable-error-code=deprecated
382421

0 commit comments

Comments
 (0)