class_docstr: Replace call with named arguments to regular calls
  
  >>> import gast as ast
  >>> from pythran import passmanager, backend
  >>> code = 'def foo(x, y): return x + y\ndef bar(z): return foo(y=z, x=0)'
  >>> node = ast.parse(code)
  >>> pm = passmanager.PassManager("test")
  >>> _, node = pm.apply(RemoveNamedArguments, node)
  >>> print(pm.dump(backend.Python, node))
  def foo(x, y):
      return (x + y)
  def bar(z):
      return foo(0, z)
class_docstr_tok: ["Replace","call","with","named","arguments","to","regular","calls",">",">",">","import","gast","as","ast",">",">",">","from","pythran","import","passmanager",",","backend",">",">",">","code","=","'def","foo","(","x",",","y",")",":","return","x","+","y\\ndef","bar","(","z",")",":","return","foo","(","y=z",",","x=0",")","'",">",">",">","node","=","ast.parse","(","code",")",">",">",">","pm","=","passmanager.PassManager","(","``","test","''",")",">",">",">","_",",","node","=","pm.apply","(","RemoveNamedArguments",",","node",")",">",">",">","print","(","pm.dump","(","backend.Python",",","node",")",")","def","foo","(","x",",","y",")",":","return","(","x","+","y",")","def","bar","(","z",")",":","return","foo","(","0",",","z",")"]
code: def visit_Call(self, node):
      if node.keywords:
          self.update = True
  
          aliases = self.aliases[node.func]
          assert aliases, "at least one alias"
  
          # all aliases should have the same structural type...
          # call to self.handle_keywords raises an exception otherwise
          try:
              replacements = {}
              for func_alias in aliases:
                  handle_special_calls(func_alias, node)
  
                  if func_alias is None:  # aliasing computation failed
                      pass
                  elif isinstance(
                      func_alias, ast.Call
                  ):  # nested function
                      # func_alias looks like functools.partial(foo, a)
                      # so we reorder using alias for 'foo'
                      offset = len(func_alias.args) - 1
                      call = func_alias.args[0]
                      for func_alias in self.aliases[call]:
                          replacements = self.handle_keywords(
                              func_alias, node, offset
                          )
                  else:
                      replacements = self.handle_keywords(
                          func_alias, node
                      )
  
              # if we reach this point, we should have a replacement
              # candidate, or nothing structural typing issues would have
              # raised an exception in handle_keywords
              if replacements:
                  for index, value in replacements.items():
                      node.args[index] = value
                  node.keywords = []
  
          except KeyError as ve:
              err = (
                  "function uses an unknown (or unsupported) keyword "
                  "argument `{}`".format(ve.args[0])
              )
              raise PythranSyntaxError(err, node)
      return self.generic_visit(node)
  
file_path: catboost/contrib/python/pythran/pythran/transformations/remove_named_arguments.py
imports: from pythran.analyses import Aliases
  from pythran.passmanager import Transformation
  from pythran.syntax import PythranSyntaxError
  from pythran.tables import MODULES
  import gast
  from copy import deepcopy
label_desc: Use image node_id 3 for calling the RemoveNamedArguments obj's underlying member method code with example usage: obj.visit_Call(node) and returns: self