$15 GRAYBYTE WORDPRESS FILE MANAGER $93

SERVER : premium201.web-hosting.com #1 SMP Wed Mar 26 12:08:09 UTC 2025
SERVER IP : 104.21.15.130 | ADMIN IP 216.73.216.51
OPTIONS : CRL = ON | WGT = ON | SDO = OFF | PKEX = OFF
DEACTIVATED : NONE

/opt/cloudlinux/venv/lib/python3.11/site-packages/pylint/checkers/

HOME
Current File : /opt/cloudlinux/venv/lib/python3.11/site-packages/pylint/checkers//nested_min_max.py
# Licensed under the GPL: https://www.gnu.org/licenses/old-licenses/gpl-2.0.html
# For details: https://github.com/PyCQA/pylint/blob/main/LICENSE
# Copyright (c) https://github.com/PyCQA/pylint/blob/main/CONTRIBUTORS.txt

"""Check for use of nested min/max functions."""

from __future__ import annotations

import copy
from typing import TYPE_CHECKING

from astroid import nodes, objects

from pylint.checkers import BaseChecker
from pylint.checkers.utils import only_required_for_messages, safe_infer
from pylint.interfaces import INFERENCE

if TYPE_CHECKING:
    from pylint.lint import PyLinter

DICT_TYPES = (
    objects.DictValues,
    objects.DictKeys,
    objects.DictItems,
    nodes.node_classes.Dict,
)


class NestedMinMaxChecker(BaseChecker):
    """Multiple nested min/max calls on the same line will raise multiple messages.

    This behaviour is intended as it would slow down the checker to check
    for nested call with minimal benefits.
    """

    FUNC_NAMES = ("builtins.min", "builtins.max")

    name = "nested_min_max"
    msgs = {
        "W3301": (
            "Do not use nested call of '%s'; it's possible to do '%s' instead",
            "nested-min-max",
            "Nested calls ``min(1, min(2, 3))`` can be rewritten as ``min(1, 2, 3)``.",
        )
    }

    @classmethod
    def is_min_max_call(cls, node: nodes.NodeNG) -> bool:
        if not isinstance(node, nodes.Call):
            return False

        inferred = safe_infer(node.func)
        return (
            isinstance(inferred, nodes.FunctionDef)
            and inferred.qname() in cls.FUNC_NAMES
        )

    @classmethod
    def get_redundant_calls(cls, node: nodes.Call) -> list[nodes.Call]:
        return [
            arg
            for arg in node.args
            if cls.is_min_max_call(arg) and arg.func.name == node.func.name
        ]

    @only_required_for_messages("nested-min-max")
    def visit_call(self, node: nodes.Call) -> None:
        if not self.is_min_max_call(node):
            return

        redundant_calls = self.get_redundant_calls(node)
        if not redundant_calls:
            return

        fixed_node = copy.copy(node)
        while len(redundant_calls) > 0:
            for i, arg in enumerate(fixed_node.args):
                # Exclude any calls with generator expressions as there is no
                # clear better suggestion for them.
                if isinstance(arg, nodes.Call) and any(
                    isinstance(a, nodes.GeneratorExp) for a in arg.args
                ):
                    return

                if arg in redundant_calls:
                    fixed_node.args = (
                        fixed_node.args[:i] + arg.args + fixed_node.args[i + 1 :]
                    )
                    break

            redundant_calls = self.get_redundant_calls(fixed_node)

        for idx, arg in enumerate(fixed_node.args):
            if not isinstance(arg, nodes.Const):
                inferred = safe_infer(arg)
                if isinstance(
                    inferred, (nodes.List, nodes.Tuple, nodes.Set, *DICT_TYPES)
                ):
                    splat_node = nodes.Starred(lineno=inferred.lineno)
                    splat_node.value = arg
                    fixed_node.args = (
                        fixed_node.args[:idx]
                        + [splat_node]
                        + fixed_node.args[idx + 1 : idx]
                    )

        self.add_message(
            "nested-min-max",
            node=node,
            args=(node.func.name, fixed_node.as_string()),
            confidence=INFERENCE,
        )


def register(linter: PyLinter) -> None:
    linter.register_checker(NestedMinMaxChecker(linter))

Current_dir [ NOT WRITEABLE ] Document_root [ NOT WRITEABLE ]


[ Back ]
NAME
SIZE
LAST TOUCH
USER
CAN-I?
FUNCTIONS
..
--
11 Feb 2026 9.30 AM
root / root
0755
__pycache__
--
11 Feb 2026 9.30 AM
root / root
0755
base
--
11 Feb 2026 9.30 AM
root / root
0755
classes
--
11 Feb 2026 9.30 AM
root / root
0755
refactoring
--
11 Feb 2026 9.30 AM
root / root
0755
__init__.py
4.265 KB
20 Jan 2026 1.01 PM
root / root
0644
async.py
3.831 KB
20 Jan 2026 1.01 PM
root / root
0644
bad_chained_comparison.py
2.176 KB
20 Jan 2026 1.01 PM
root / root
0644
base_checker.py
10.675 KB
20 Jan 2026 1.01 PM
root / root
0644
deprecated.py
9.435 KB
20 Jan 2026 1.01 PM
root / root
0644
design_analysis.py
21.62 KB
20 Jan 2026 1.01 PM
root / root
0644
dunder_methods.py
3.431 KB
20 Jan 2026 1.01 PM
root / root
0644
ellipsis_checker.py
1.967 KB
20 Jan 2026 1.01 PM
root / root
0644
exceptions.py
26.048 KB
20 Jan 2026 1.01 PM
root / root
0644
format.py
26.912 KB
20 Jan 2026 1.01 PM
root / root
0644
imports.py
41.311 KB
20 Jan 2026 1.01 PM
root / root
0644
lambda_expressions.py
3.381 KB
20 Jan 2026 1.01 PM
root / root
0644
logging.py
15.841 KB
20 Jan 2026 1.01 PM
root / root
0644
mapreduce_checker.py
1.085 KB
20 Jan 2026 1.01 PM
root / root
0644
method_args.py
4.678 KB
20 Jan 2026 1.01 PM
root / root
0644
misc.py
4.87 KB
20 Jan 2026 1.01 PM
root / root
0644
modified_iterating_checker.py
7.675 KB
20 Jan 2026 1.01 PM
root / root
0644
nested_min_max.py
3.633 KB
20 Jan 2026 1.01 PM
root / root
0644
newstyle.py
4.46 KB
20 Jan 2026 1.01 PM
root / root
0644
non_ascii_names.py
6.979 KB
20 Jan 2026 1.01 PM
root / root
0644
raw_metrics.py
3.809 KB
20 Jan 2026 1.01 PM
root / root
0644
similar.py
33.292 KB
20 Jan 2026 1.01 PM
root / root
0644
spelling.py
16.168 KB
20 Jan 2026 1.01 PM
root / root
0644
stdlib.py
31.277 KB
20 Jan 2026 1.01 PM
root / root
0644
strings.py
40.275 KB
20 Jan 2026 1.01 PM
root / root
0644
threading_checker.py
1.896 KB
20 Jan 2026 1.01 PM
root / root
0644
typecheck.py
86.833 KB
20 Jan 2026 1.01 PM
root / root
0644
unicode.py
18.047 KB
20 Jan 2026 1.01 PM
root / root
0644
unsupported_version.py
2.929 KB
20 Jan 2026 1.01 PM
root / root
0644
utils.py
77.257 KB
20 Jan 2026 1.01 PM
root / root
0644
variables.py
126.569 KB
20 Jan 2026 1.01 PM
root / root
0644

GRAYBYTE WORDPRESS FILE MANAGER @ 2026 CONTACT ME
Static GIF Static GIF