Skip to content

[networkx] More precise annotation for nested tuples#14287

Open
AckslD wants to merge 3 commits into
python:mainfrom
AckslD:networkx-nested-tuple
Open

[networkx] More precise annotation for nested tuples#14287
AckslD wants to merge 3 commits into
python:mainfrom
AckslD:networkx-nested-tuple

Conversation

@AckslD

@AckslD AckslD commented Jun 16, 2025

Copy link
Copy Markdown
Contributor

Followup to #14218 based on the suggestion by @Avasam.

Comment thread stubs/networkx/networkx/algorithms/tree/coding.pyi Outdated

__all__ = ["from_nested_tuple", "from_prufer_sequence", "NotATree", "to_nested_tuple", "to_prufer_sequence"]

_NestedTuple: TypeAlias = tuple[_NestedTuple, ...]

@brianschubert brianschubert Jun 16, 2025

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should the RHS include a union with some other type? This currently only allows tuples with tuple entries (ultimately terminating with empty tuples)

Huh, apparently that's correct:
https://networkx.org/documentation/stable/reference/algorithms/generated/networkx.algorithms.tree.coding.from_nested_tuple.html#from-nested-tuple

Nevermind then! Sorry for the noise :-)

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unless my understanding is wrong, there should indeed be no other types but only nested tuples:
https://networkx.org/documentation/stable/reference/algorithms/generated/networkx.algorithms.tree.coding.from_nested_tuple.html

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No worries, thanks for taking a look :)

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I was gonna ask the same question. And made the same assumption in my initial comment. Could you add a comment here pointing to that documentation ?

Suggested change
_NestedTuple: TypeAlias = tuple[_NestedTuple, ...]
# > The tree with one node and no edges is represented by the empty tuple, ()
# https://networkx.org/documentation/stable/reference/algorithms/generated/networkx.algorithms.tree.coding.from_nested_tuple.html#from-nested-tuple
# So this really only recuses on tuples
_NestedTuple: TypeAlias = tuple[_NestedTuple, ...]

Feel free to reword.

(as a side note, you could write _NestedTuple: TypeAlias = tuple[_NestedTuple | tuple[()], ...], but that quickly becomes unusable/too unwieldy)

Otherwise LGTM.

@github-actions

This comment has been minimized.

Co-authored-by: Brian Schubert <brianm.schubert@gmail.com>
@github-actions

Copy link
Copy Markdown
Contributor

According to mypy_primer, this change has no effect on the checked open source code. 🤖🎉

class NotATree(NetworkXException): ...

@_dispatchable
def to_nested_tuple(T: Graph[_Node], root: _Node, canonical_form: bool = False): ...

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

While we're here...

Suggested change
def to_nested_tuple(T: Graph[_Node], root: _Node, canonical_form: bool = False): ...
def to_nested_tuple(T: Graph[_Node], root: _Node, canonical_form: bool = False) -> _NestedTuple: ...

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sounds good, I wasn't sure if the return hints were left out for a reason


__all__ = ["from_nested_tuple", "from_prufer_sequence", "NotATree", "to_nested_tuple", "to_prufer_sequence"]

_NestedTuple: TypeAlias = tuple[_NestedTuple, ...]

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I was gonna ask the same question. And made the same assumption in my initial comment. Could you add a comment here pointing to that documentation ?

Suggested change
_NestedTuple: TypeAlias = tuple[_NestedTuple, ...]
# > The tree with one node and no edges is represented by the empty tuple, ()
# https://networkx.org/documentation/stable/reference/algorithms/generated/networkx.algorithms.tree.coding.from_nested_tuple.html#from-nested-tuple
# So this really only recuses on tuples
_NestedTuple: TypeAlias = tuple[_NestedTuple, ...]

Feel free to reword.

(as a side note, you could write _NestedTuple: TypeAlias = tuple[_NestedTuple | tuple[()], ...], but that quickly becomes unusable/too unwieldy)

Otherwise LGTM.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants