diff options
author | Marc Mueller <30130371+cdce8p@users.noreply.github.com> | 2023-04-24 11:08:16 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-04-24 11:08:16 +0200 |
commit | 5d7c796a83350c333e767fe8eb68870af576fd85 (patch) | |
tree | 8b0e53ab967de68e5088882d05bd9871a052654d | |
parent | 65670d74cd28fa63aa7418272b04140daec13322 (diff) | |
parent | c9da8f3e5874e0169ec9ebb26836d65573fa4ae4 (diff) | |
download | astroid-git-5d7c796a83350c333e767fe8eb68870af576fd85.tar.gz |
Merge pull request #2145 from cdce8p/merge-2.15.4
Merge changes following 2.15.4 release
-rw-r--r-- | ChangeLog | 12 | ||||
-rw-r--r-- | astroid/__init__.py | 1 | ||||
-rw-r--r-- | astroid/node_classes.py | 1 | ||||
-rw-r--r-- | astroid/nodes/__init__.py | 2 | ||||
-rw-r--r-- | astroid/nodes/as_string.py | 22 | ||||
-rw-r--r-- | astroid/nodes/node_ng.py | 2 | ||||
-rw-r--r-- | astroid/rebuilder.py | 6 | ||||
-rw-r--r-- | doc/api/astroid.nodes.rst | 3 | ||||
-rw-r--r-- | tests/test_group_exceptions.py | 8 |
9 files changed, 48 insertions, 9 deletions
@@ -100,12 +100,22 @@ Release date: TBA Refs #2141 -What's New in astroid 2.15.4? +What's New in astroid 2.15.5? ============================= Release date: TBA +What's New in astroid 2.15.4? +============================= +Release date: 2023-04-24 + +* Add visitor function for ``TryStar`` to ``AsStringVisitor`` and + add ``TryStar`` to ``astroid.nodes.ALL_NODE_CLASSES``. + + Refs #2142 + + What's New in astroid 2.15.3? ============================= Release date: 2023-04-16 diff --git a/astroid/__init__.py b/astroid/__init__.py index 6711563a..d1251191 100644 --- a/astroid/__init__.py +++ b/astroid/__init__.py @@ -163,6 +163,7 @@ from astroid.nodes import ( # pylint: disable=redefined-builtin (Ellipsis) Subscript, TryExcept, TryFinally, + TryStar, Tuple, UnaryOp, Unknown, diff --git a/astroid/node_classes.py b/astroid/node_classes.py index de375917..fecb006e 100644 --- a/astroid/node_classes.py +++ b/astroid/node_classes.py @@ -76,6 +76,7 @@ from astroid.nodes.node_classes import ( # pylint: disable=redefined-builtin (E Subscript, TryExcept, TryFinally, + TryStar, Tuple, UnaryOp, Unknown, diff --git a/astroid/nodes/__init__.py b/astroid/nodes/__init__.py index 9b75ee65..d67c6a5b 100644 --- a/astroid/nodes/__init__.py +++ b/astroid/nodes/__init__.py @@ -197,6 +197,7 @@ ALL_NODE_CLASSES = ( Subscript, TryExcept, TryFinally, + TryStar, Tuple, UnaryOp, Unknown, @@ -291,6 +292,7 @@ __all__ = ( "Subscript", "TryExcept", "TryFinally", + "TryStar", "Tuple", "UnaryOp", "Unknown", diff --git a/astroid/nodes/as_string.py b/astroid/nodes/as_string.py index 48d933c7..49ef1b77 100644 --- a/astroid/nodes/as_string.py +++ b/astroid/nodes/as_string.py @@ -9,6 +9,8 @@ from __future__ import annotations from collections.abc import Iterator from typing import TYPE_CHECKING +from astroid import nodes + if TYPE_CHECKING: from astroid.nodes import Const from astroid.nodes.node_classes import ( @@ -254,13 +256,16 @@ class AsStringVisitor: return "" def visit_excepthandler(self, node) -> str: + n = "except" + if isinstance(getattr(node, "parent", None), nodes.TryStar): + n = "except*" if node.type: if node.name: - excs = f"except {node.type.accept(self)} as {node.name.accept(self)}" + excs = f"{n} {node.type.accept(self)} as {node.name.accept(self)}" else: - excs = f"except {node.type.accept(self)}" + excs = f"{n} {node.type.accept(self)}" else: - excs = "except" + excs = f"{n}" return f"{excs}:\n{self._stmt_list(node.body)}" def visit_empty(self, node) -> str: @@ -495,6 +500,17 @@ class AsStringVisitor: self._stmt_list(node.body), self._stmt_list(node.finalbody) ) + def visit_trystar(self, node) -> str: + """return an astroid.TryStar node as string""" + trys = [f"try:\n{self._stmt_list(node.body)}"] + for handler in node.handlers: + trys.append(handler.accept(self)) + if node.orelse: + trys.append(f"else:\n{self._stmt_list(node.orelse)}") + if node.finalbody: + trys.append(f"finally:\n{self._stmt_list(node.finalbody)}") + return "\n".join(trys) + def visit_tuple(self, node) -> str: """return an astroid.Tuple node as string""" if len(node.elts) == 1: diff --git a/astroid/nodes/node_ng.py b/astroid/nodes/node_ng.py index bc981b91..41abc451 100644 --- a/astroid/nodes/node_ng.py +++ b/astroid/nodes/node_ng.py @@ -587,7 +587,7 @@ class NodeNG: yield from () def _infer_name(self, frame, name): - # overridden for ImportFrom, Import, Global, TryExcept and Arguments + # overridden for ImportFrom, Import, Global, TryExcept, TryStar and Arguments pass def _infer( diff --git a/astroid/rebuilder.py b/astroid/rebuilder.py index dd5c74f2..64c1c123 100644 --- a/astroid/rebuilder.py +++ b/astroid/rebuilder.py @@ -422,6 +422,12 @@ class TreeRebuilder: ) -> nodes.TryExcept | nodes.TryFinally: ... + if sys.version_info >= (3, 11): + + @overload + def visit(self, node: ast.TryStar, parent: NodeNG) -> nodes.TryStar: + ... + @overload def visit(self, node: ast.Tuple, parent: NodeNG) -> nodes.Tuple: ... diff --git a/doc/api/astroid.nodes.rst b/doc/api/astroid.nodes.rst index 7372cdd5..3e99e93b 100644 --- a/doc/api/astroid.nodes.rst +++ b/doc/api/astroid.nodes.rst @@ -80,6 +80,7 @@ Nodes astroid.nodes.Subscript astroid.nodes.TryExcept astroid.nodes.TryFinally + astroid.nodes.TryStar astroid.nodes.Tuple astroid.nodes.UnaryOp astroid.nodes.Unknown @@ -230,6 +231,8 @@ Nodes .. autoclass:: astroid.nodes.TryFinally +.. autoclass:: astroid.nodes.TryStar + .. autoclass:: astroid.nodes.Tuple .. autoclass:: astroid.nodes.UnaryOp diff --git a/tests/test_group_exceptions.py b/tests/test_group_exceptions.py index f000ee99..ce1f142a 100644 --- a/tests/test_group_exceptions.py +++ b/tests/test_group_exceptions.py @@ -54,9 +54,8 @@ def test_group_exceptions() -> None: @pytest.mark.skipif(not PY311_PLUS, reason="Requires Python 3.11 or higher") def test_star_exceptions() -> None: - node = extract_node( - textwrap.dedent( - """ + code = textwrap.dedent( + """ try: raise ExceptionGroup("group", [ValueError(654)]) except* ValueError: @@ -67,9 +66,10 @@ def test_star_exceptions() -> None: sys.exit(127) finally: sys.exit(0)""" - ) ) + node = extract_node(code) assert isinstance(node, TryStar) + assert node.as_string() == code.replace('"', "'").strip() assert isinstance(node.body[0], Raise) assert node.block_range(1) == (1, 11) assert node.block_range(2) == (2, 2) |