code: def save_arguments(module_name, elements):
      """Recursively save arguments name and default value."""
      for elem, signature in elements.items():
          if isinstance(signature, dict):  # Submodule case
              save_arguments(module_name + (elem,), signature)
          else:
              # use introspection to get the Python obj
              try:
                  themodule = import_module(".".join(module_name))
                  obj = getattr(themodule, elem)
                  while hasattr(obj, "__wrapped__"):
                      obj = obj.__wrapped__
              except (AttributeError, ImportError, TypeError):
                  continue
  
              # first try to gather info through getfullargspec
              try:
                  spec = inspect.getfullargspec(obj)
              except:
                  continue
  
              args = [
                  ast.Name(arg, ast.Param(), None, None)
                  for arg in spec.args
              ]
              defaults = list(spec.defaults or [])
              args += [
                  ast.Name(arg, ast.Param(), None, None)
                  for arg in spec.kwonlyargs
              ]
              defaults += [
                  spec.kwonlydefaults[kw] for kw in spec.kwonlyargs
              ]
  
              # Check if we already have a pythran description for that object
              if signature.args.args:
                  if module_name != ("numpy", "random"):
                      # Skip this warning for `numpy.random`, because the
                      # signatures changed in 1.25.x and that may yet be reverted
                      # (see pythran#2139) in 1.25.3 and/or 1.26.x
                      logger.warning(
                          "Overriding pythran description with argspec "
                          "information for: {}".format(
                              ".".join(module_name + (elem,))
                          )
                      )
                  else:
                      continue
  
              # Avoid use of comprehension to fill "as much args/defaults" as
              # possible
              signature_args = args[: -len(defaults) or None]
              signature_defaults = []
              try:
                  for arg, value in zip(
                      args[-len(defaults) :], defaults
                  ):
                      signature_args.append(arg)
                      signature_defaults.append(to_ast(value))
              except ToNotEval:
                  continue
  
              # Only validate once we have a valid signature
              signature.args.args = signature_args
              signature.args.defaults = signature_defaults
  
imports: import gast
  from importlib import import_module
  import inspect
  import logging
  import numpy
  import sys
  from pythran.typing import Dict, Set, List, TypeVar, Union, Optional, NDArray
  from pythran.typing import Generator, Fun, Tuple, Iterable, Sized, File
  from pythran.conversion import to_ast, ToNotEval
  from pythran.intrinsic import Class
  from pythran.intrinsic import ClassWithConstConstructor, ExceptionClass
  from pythran.intrinsic import ClassWithReadOnceConstructor
  from pythran.intrinsic import ConstFunctionIntr, FunctionIntr, UpdateEffect
  from pythran.intrinsic import ConstMethodIntr, MethodIntr
  from pythran.intrinsic import AttributeIntr, StaticAttributeIntr
  from pythran.intrinsic import ReadEffect, ConstantIntr, UFunc
  from pythran.intrinsic import ReadOnceMethodIntr
  from pythran.intrinsic import ReadOnceFunctionIntr, ConstExceptionIntr
  from pythran import interval
  import beniget
label_desc: Use image node_id 7 for calling a global function with example usage: save_arguments(module_name, elements) without return types