From ab301db1432a0acd23c55fb2c0f248ec6b8b3ba0 Mon Sep 17 00:00:00 2001 From: Jacob Walls Date: Sat, 7 Dec 2024 09:18:29 -0500 Subject: [PATCH 1/3] Add compatibility with python 3.13.1 Refs https://github.com/python/cpython/pull/125415 --- ChangeLog | 4 ++++ astroid/brain/brain_collections.py | 13 ++++++++----- astroid/const.py | 1 + 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index 8dba33223f..724d6b45c2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -31,6 +31,10 @@ What's New in astroid 3.3.6? ============================ Release date: TBA +* Fix inability to import `collections.abc` in python 3.13.1. + + Closes pylint-dev/pylint#10112 + * Fix precedence of `path` arg in `modpath_from_file_with_callback` to be higher than `sys.path` diff --git a/astroid/brain/brain_collections.py b/astroid/brain/brain_collections.py index 94944e67ad..46709d1b32 100644 --- a/astroid/brain/brain_collections.py +++ b/astroid/brain/brain_collections.py @@ -8,7 +8,7 @@ from astroid.brain.helpers import register_module_extender from astroid.builder import AstroidBuilder, extract_node, parse -from astroid.const import PY313_PLUS +from astroid.const import PY313_0, PY313_PLUS from astroid.context import InferenceContext from astroid.exceptions import AttributeInferenceError from astroid.manager import AstroidManager @@ -20,7 +20,10 @@ def _collections_transform(): return parse( - """ + "import _collections_abc as abc" + if PY313_PLUS and not PY313_0 + else "" + + """ class defaultdict(dict): default_factory = None def __missing__(self, key): pass @@ -32,7 +35,7 @@ def __getitem__(self, key): return default_factory ) -def _collections_abc_313_transform() -> nodes.Module: +def _collections_abc_313_0_transform() -> nodes.Module: """See https://github.com/python/cpython/pull/124735""" return AstroidBuilder(AstroidManager()).string_build( "from _collections_abc import *" @@ -132,7 +135,7 @@ def register(manager: AstroidManager) -> None: ClassDef, easy_class_getitem_inference, _looks_like_subscriptable ) - if PY313_PLUS: + if PY313_0: register_module_extender( - manager, "collections.abc", _collections_abc_313_transform + manager, "collections.abc", _collections_abc_313_0_transform ) diff --git a/astroid/const.py b/astroid/const.py index c010818063..a10c0f4a2b 100644 --- a/astroid/const.py +++ b/astroid/const.py @@ -9,6 +9,7 @@ PY311_PLUS = sys.version_info >= (3, 11) PY312_PLUS = sys.version_info >= (3, 12) PY313_PLUS = sys.version_info >= (3, 13) +PY313_0 = sys.version_info[:3] == (3, 13, 0) WIN32 = sys.platform == "win32" From 2b8eb9af092ffb6af2d533fdc7bc8f11417938a0 Mon Sep 17 00:00:00 2001 From: Jacob Walls Date: Sat, 7 Dec 2024 20:51:23 -0500 Subject: [PATCH 2/3] fixup! Add compat --- astroid/brain/brain_collections.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/astroid/brain/brain_collections.py b/astroid/brain/brain_collections.py index 46709d1b32..a93221ef27 100644 --- a/astroid/brain/brain_collections.py +++ b/astroid/brain/brain_collections.py @@ -20,9 +20,7 @@ def _collections_transform(): return parse( - "import _collections_abc as abc" - if PY313_PLUS and not PY313_0 - else "" + ("import _collections_abc as abc" if PY313_PLUS and not PY313_0 else "") + """ class defaultdict(dict): default_factory = None From 94036c346dfb2d79fe93e9deacbcdafe85fefaf3 Mon Sep 17 00:00:00 2001 From: Jacob Walls Date: Sat, 7 Dec 2024 20:57:19 -0500 Subject: [PATCH 3/3] fixup! Add compat --- astroid/brain/brain_collections.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/astroid/brain/brain_collections.py b/astroid/brain/brain_collections.py index a93221ef27..462c85add2 100644 --- a/astroid/brain/brain_collections.py +++ b/astroid/brain/brain_collections.py @@ -20,7 +20,7 @@ def _collections_transform(): return parse( - ("import _collections_abc as abc" if PY313_PLUS and not PY313_0 else "") + (" import _collections_abc as abc" if PY313_PLUS and not PY313_0 else "") + """ class defaultdict(dict): default_factory = None