Tipragot
628be439b8
Cela permet de ne pas avoir de problèmes de compatibilité car python est dans le git.
53 lines
1.6 KiB
Python
53 lines
1.6 KiB
Python
# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html
|
|
# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE
|
|
# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt
|
|
|
|
from __future__ import annotations
|
|
|
|
from collections.abc import Iterator
|
|
|
|
from astroid import bases, context, inference_tip, nodes
|
|
from astroid.builder import _extract_single_node
|
|
from astroid.exceptions import InferenceError, UseInferenceDefault
|
|
from astroid.manager import AstroidManager
|
|
|
|
PATH_TEMPLATE = """
|
|
from pathlib import Path
|
|
Path
|
|
"""
|
|
|
|
|
|
def _looks_like_parents_subscript(node: nodes.Subscript) -> bool:
|
|
if not (
|
|
isinstance(node.value, nodes.Attribute) and node.value.attrname == "parents"
|
|
):
|
|
return False
|
|
|
|
try:
|
|
value = next(node.value.infer())
|
|
except (InferenceError, StopIteration):
|
|
return False
|
|
return (
|
|
isinstance(value, bases.Instance)
|
|
and isinstance(value._proxied, nodes.ClassDef)
|
|
and value.qname() == "pathlib._PathParents"
|
|
)
|
|
|
|
|
|
def infer_parents_subscript(
|
|
subscript_node: nodes.Subscript, ctx: context.InferenceContext | None = None
|
|
) -> Iterator[bases.Instance]:
|
|
if isinstance(subscript_node.slice, nodes.Const):
|
|
path_cls = next(_extract_single_node(PATH_TEMPLATE).infer())
|
|
return iter([path_cls.instantiate_class()])
|
|
|
|
raise UseInferenceDefault
|
|
|
|
|
|
def register(manager: AstroidManager) -> None:
|
|
manager.register_transform(
|
|
nodes.Subscript,
|
|
inference_tip(infer_parents_subscript),
|
|
_looks_like_parents_subscript,
|
|
)
|