Skip to content

functools.partial not well supported #2967

Closed

Description

@rhettinger

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*]]

Activity

  1. JukkaL commented on Mar 6, 2017

    @JukkaL
    Collaborator

    Mypy doesn't fully support partial (#1484), and because of the way the stub for partial is written, you also get bitten by #797.

  2. socketpair commented on Mar 28, 2020

    @socketpair
    def test(x: str, y: int):
        pass
    
    z1 = partial(test, 42)
    z2 = partial(test, 42, 6.7)

    It also does not generate any warnings.

  3. AlexWaygood commented on Mar 27, 2022

    @AlexWaygood
    Member

    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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions