GRAYBYTE WORDPRESS FILE MANAGER6929

Server IP : 198.54.121.189 / Your IP : 216.73.216.112
System : Linux premium69.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
PHP Version : 7.4.33
Disable Function : NONE
cURL : ON | WGET : ON | Sudo : OFF | Pkexec : OFF
Directory : /opt/cloudlinux/venv/lib/python3.11/site-packages/pylint/checkers/
Upload Files :
Current_dir [ Not Writeable ] Document_root [ Writeable ]

Command :


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))

[ Back ]
Name
Size
Last Modified
Owner / Group
Permissions
Options
..
--
May 15 2025 08:30:34
root / root
0755
__pycache__
--
May 15 2025 08:30:34
root / root
0755
base
--
May 15 2025 08:30:34
root / root
0755
classes
--
May 15 2025 08:30:34
root / root
0755
refactoring
--
May 15 2025 08:30:34
root / root
0755
__init__.py
4.265 KB
April 17 2025 13:10:59
root / root
0644
async.py
3.831 KB
April 17 2025 13:10:59
root / root
0644
bad_chained_comparison.py
2.176 KB
April 17 2025 13:10:59
root / root
0644
base_checker.py
10.675 KB
April 17 2025 13:10:59
root / root
0644
deprecated.py
9.435 KB
April 17 2025 13:10:59
root / root
0644
design_analysis.py
21.62 KB
April 17 2025 13:10:59
root / root
0644
dunder_methods.py
3.431 KB
April 17 2025 13:10:59
root / root
0644
ellipsis_checker.py
1.967 KB
April 17 2025 13:10:59
root / root
0644
exceptions.py
26.048 KB
April 17 2025 13:10:59
root / root
0644
format.py
26.912 KB
April 17 2025 13:10:59
root / root
0644
imports.py
41.311 KB
April 17 2025 13:10:59
root / root
0644
lambda_expressions.py
3.381 KB
April 17 2025 13:10:59
root / root
0644
logging.py
15.841 KB
April 17 2025 13:10:59
root / root
0644
mapreduce_checker.py
1.085 KB
April 17 2025 13:10:59
root / root
0644
method_args.py
4.678 KB
April 17 2025 13:10:59
root / root
0644
misc.py
4.87 KB
April 17 2025 13:10:59
root / root
0644
modified_iterating_checker.py
7.675 KB
April 17 2025 13:10:59
root / root
0644
nested_min_max.py
3.633 KB
April 17 2025 13:10:59
root / root
0644
newstyle.py
4.46 KB
April 17 2025 13:10:59
root / root
0644
non_ascii_names.py
6.979 KB
April 17 2025 13:10:59
root / root
0644
raw_metrics.py
3.809 KB
April 17 2025 13:10:59
root / root
0644
similar.py
33.292 KB
April 17 2025 13:10:59
root / root
0644
spelling.py
16.168 KB
April 17 2025 13:10:59
root / root
0644
stdlib.py
31.277 KB
April 17 2025 13:10:59
root / root
0644
strings.py
40.275 KB
April 17 2025 13:10:59
root / root
0644
threading_checker.py
1.896 KB
April 17 2025 13:10:59
root / root
0644
typecheck.py
86.833 KB
April 17 2025 13:10:59
root / root
0644
unicode.py
18.047 KB
April 17 2025 13:10:59
root / root
0644
unsupported_version.py
2.929 KB
April 17 2025 13:10:59
root / root
0644
utils.py
77.257 KB
April 17 2025 13:10:59
root / root
0644
variables.py
126.569 KB
April 17 2025 13:10:59
root / root
0644

GRAYBYTE WORDPRESS FILE MANAGER @ 2025
CONTACT ME
Static GIF