Qiskit / rustworkx

A high performance Python graph library implemented in Rust.
https://www.rustworkx.org
Apache License 2.0
967 stars 140 forks source link

Problem type checking `ancestors()` with pyright #1242

Open jlhamilton777 opened 3 days ago

jlhamilton777 commented 3 days ago

Information

What is the current behavior?

Pyright is unable to fully type check the rustworkx.ancestors() function in strict mode.

What is the expected behavior?

Pyright should be able to determine the type of ancestors(), including the parameterized type of the graph parameter.

Steps to reproduce the problem

# pyright: strict

import rustworkx as rx

graph: rx.PyDiGraph[int, float] = rx.PyDiGraph()
node = graph.add_node(7)
rx.ancestors(graph, node)
$ pyright .
./main.py
  ./main.py:7:1 - error: Type of "ancestors" is partially unknown
    Type of "ancestors" is "(graph: PyDiGraph[Unknown, Unknown], node: int, /) -> set[int]" (reportUnknownMemberType)
1 error, 0 warnings, 0 informations

I looked at the stub file https://github.com/Qiskit/rustworkx/blob/553bff1823a30293c82fb811f4457b094700a728/rustworkx/rustworkx.pyi#L985-L990 and graph doesn't have PyDiGraph[_S, _T] like in some of the other functions. I also ran into this issue with the descendants() function.

IvanIsCoding commented 3 days ago

We can replace the signature with PyDiGraph[Any,Any], but honestly that is a pyright quirk from https://github.com/microsoft/pyright/discussions/5101.

Mypy treat it as Any which is what we tested for. I’ll explore how Pyre and Pytype treat it so we can have a solution that works well with most type checkers