Given this code:
from typing import Tuple from math import hypot from functools import partial def dist(p: Tuple[float, float], q: Tuple[float, float]) -> float: px, py = p qx, qy = q return hypot(px - qx, py - qy) base = (1.9, 7.5) targets = [(3,7), (2,6), (1,8), (0,7)] def make_fixed_dist(q): def fixed_dist(p): return dist(p, q) return fixed_dist print( min(targets, key=make_fixed_dist(base)) ) print( min(targets, key=partial(dist, base)) )
mypy cheerfully accepts the closure but chokes on the equivalent partial:
$ mypy tmp.py tmp.py:19: error: No overload variant of "min" matches argument types [builtins.list[Tuple[builtins.int, builtins.int]], functools.partial[builtins.float*]]
Mypy doesn't fully support partial (#1484), and because of the way the stub for partial is written, you also get bitten by #797.
def test(x: str, y: int): pass z1 = partial(test, 42) z2 = partial(test, 42, 6.7)
It also does not generate any warnings.
The original snippet provided by @rhettinger no longer causes mypy to emit an error. There are still issues with mypy's support for functools.partial, but #1484 is the better place to discuss those.
Activity
JukkaL commented on Mar 6, 2017
Mypy doesn't fully support partial (#1484), and because of the way the stub for partial is written, you also get bitten by #797.
socketpair commented on Mar 28, 2020
It also does not generate any warnings.
AlexWaygood commented on Mar 27, 2022
The original snippet provided by @rhettinger no longer causes mypy to emit an error. There are still issues with mypy's support for functools.partial, but #1484 is the better place to discuss those.