Skip to content

scipy-stubs: scipy.optimize.least_squares function inferred as module #20079

@jorenham

Description

@jorenham

As reported in scipy/scipy-stubs#939, mypy seems to infer scipy.optimize.least_squares as a ModuleType. Other type-checkers (pyright, basedpyright, pyrefly) correctly infer it as a function.

from typing import reveal_type
from scipy.optimize import least_squares

reveal_type(least_squares)
  • mypy: Revealed type is "types.ModuleType"
  • pyrefly: revealed type: (fun: (🍝) -> OptimizeResult
  • (based)pyright: Type of "least_squares" is "(fun: (🍝) -> OptimizeResult"

(🍝 = the huge function signature)

This seems to occur on (at least) scipy-stubs 1.16.2.0 and 1.16.2.3, using mypy 1.18.2.

To repro, install scipy-stubs[scipy]==1.16.2.3 (currently the latest) from pypi or scipy-typed from conda.

Here's are the relevant bits of code:

  1. optimize/__init__.pyi re-exports from ._lsq import least_squares through __all__
  2. optimize/_lsq/__init__.pyi re-exports from .least_squares import least_squares through __all__
  3. optimize/_lsq/least_squares.pyi contains the definition for the least_squares function

It looks like mypy ignores step optimize/_lsq/__init__.pyi from 2., causing it to resolve the optimize._lsq.least_squares module, instead of (explicitly re-exported) optimize._lsq.least_squares.least_squares function.

I expect to be able to work around this by changing from ._lsq import least_squares in optimize/__init__.pyi to from ._lsq.least_squares import least_squares.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugmypy got something wrongtopic-runtime-semanticsmypy doesn't model runtime semantics correctly

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions