SILENT KILLERPanel

Current Path: > > opt > cloudlinux > venv > lib64 > python3.11 > site-packages > pylint > checkers


Operation   : Linux premium131.web-hosting.com 4.18.0-553.44.1.lve.el8.x86_64 #1 SMP Thu Mar 13 14:29:12 UTC 2025 x86_64
Software     : Apache
Server IP    : 162.0.232.56 | Your IP: 216.73.216.111
Domains      : 1034 Domain(s)
Permission   : [ 0755 ]

Files and Folders in: //opt/cloudlinux/venv/lib64/python3.11/site-packages/pylint/checkers

NameTypeSizeLast ModifiedActions
__pycache__ Directory - -
base Directory - -
classes Directory - -
refactoring Directory - -
__init__.py File 4367 bytes April 17 2025 13:10:59.
async.py File 3923 bytes April 17 2025 13:10:59.
bad_chained_comparison.py File 2228 bytes April 17 2025 13:10:59.
base_checker.py File 10931 bytes April 17 2025 13:10:59.
deprecated.py File 9661 bytes April 17 2025 13:10:59.
design_analysis.py File 22139 bytes April 17 2025 13:10:59.
dunder_methods.py File 3513 bytes April 17 2025 13:10:59.
ellipsis_checker.py File 2014 bytes April 17 2025 13:10:59.
exceptions.py File 26673 bytes April 17 2025 13:10:59.
format.py File 27558 bytes April 17 2025 13:10:59.
imports.py File 42302 bytes April 17 2025 13:10:59.
lambda_expressions.py File 3462 bytes April 17 2025 13:10:59.
logging.py File 16221 bytes April 17 2025 13:10:59.
mapreduce_checker.py File 1111 bytes April 17 2025 13:10:59.
method_args.py File 4790 bytes April 17 2025 13:10:59.
misc.py File 4987 bytes April 17 2025 13:10:59.
modified_iterating_checker.py File 7859 bytes April 17 2025 13:10:59.
nested_min_max.py File 3720 bytes April 17 2025 13:10:59.
newstyle.py File 4567 bytes April 17 2025 13:10:59.
non_ascii_names.py File 7146 bytes April 17 2025 13:10:59.
raw_metrics.py File 3900 bytes April 17 2025 13:10:59.
similar.py File 34091 bytes April 17 2025 13:10:59.
spelling.py File 16556 bytes April 17 2025 13:10:59.
stdlib.py File 32028 bytes April 17 2025 13:10:59.
strings.py File 41242 bytes April 17 2025 13:10:59.
threading_checker.py File 1941 bytes April 17 2025 13:10:59.
typecheck.py File 88917 bytes April 17 2025 13:10:59.
unicode.py File 18480 bytes April 17 2025 13:10:59.
unsupported_version.py File 2999 bytes April 17 2025 13:10:59.
utils.py File 79111 bytes April 17 2025 13:10:59.
variables.py File 129607 bytes April 17 2025 13:10:59.

Reading File: //opt/cloudlinux/venv/lib64/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))

SILENT KILLER Tool