From 360de966e9314ac73c6277e3ddf45e0dd7b36eb0 Mon Sep 17 00:00:00 2001 From: Hrithik Saini <49943287+hrithiksaini99@users.noreply.github.com> Date: Wed, 4 Nov 2026 12:17:18 +0530 Subject: [PATCH] [networkx] Fix NodeDataView return type for string attribute in nodes(data=...) (#16548) - Update NodeView.__call__ and NodeView.data overloads to return NodeDataView[_Node, _U] when data is a string - Make NodeDataView generic over [_Node, _D] so __iter__ yields tuple[_Node, _D] and __getitem__ returns _D - Fixes #16548 --- .../networkx/networkx/classes/reportviews.pyi | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/stubs/networkx/networkx/classes/reportviews.pyi b/stubs/networkx/networkx/classes/reportviews.pyi index 5bf0396d6108..84c612e12d6c 100644 --- a/stubs/networkx/networkx/classes/reportviews.pyi +++ b/stubs/networkx/networkx/classes/reportviews.pyi @@ -43,22 +43,26 @@ class NodeView(Mapping[_Node, _NodeData], AbstractSet[_Node], Generic[_Node, _No def __contains__(self, n: object) -> bool: ... @overload - def __call__(self, data: Literal[False] = False, default=None) -> Self: ... + def __call__(self, data: Literal[False] = False, default: Unused = None) -> Self: ... @overload - def __call__(self, data: Literal[True] | str, default=None) -> NodeDataView[_Node, _NodeData, _EdgeData]: ... + def __call__(self, data: Literal[True], default: None = None) -> NodeDataView[_Node, _NodeData]: ... + @overload + def __call__(self, data: str, default: _U | None = None) -> NodeDataView[_Node, _U]: ... @overload - def data(self, data: Literal[False], default=None) -> Self: ... + def data(self, data: Literal[False], default: Unused = None) -> Self: ... + @overload + def data(self, data: Literal[True] = True, default: None = None) -> NodeDataView[_Node, _NodeData]: ... @overload - def data(self, data: Literal[True] | str = True, default=None) -> NodeDataView[_Node, _NodeData, _EdgeData]: ... + def data(self, data: str, default: _U | None = None) -> NodeDataView[_Node, _U]: ... -class NodeDataView(AbstractSet[_Node], Generic[_Node, _NodeData, _EdgeData]): +class NodeDataView(AbstractSet[_Node], Generic[_Node, _D]): __slots__ = ("_nodes", "_data", "_default") - def __init__(self, nodedict: _NodeData, data: bool | str = False, default=None) -> None: ... + def __init__(self, nodedict, data: bool | str = False, default: object = None) -> None: ... def __len__(self) -> int: ... - def __iter__(self) -> Iterator[tuple[_Node, _NodeData]]: ... # type: ignore[override] + def __iter__(self) -> Iterator[tuple[_Node, _D]]: ... # type: ignore[override] def __contains__(self, n: object) -> bool: ... - def __getitem__(self, n: _Node) -> _NodeData | Incomplete: ... + def __getitem__(self, n: _Node) -> _D: ... class DiDegreeView(Generic[_Node, _NodeData, _EdgeData]): def __init__(