Recurses over a nested structure to look for changes in Suds objects.

  Args:
    obj: A parameter for a SOAP request field which is to be inspected and
        will be packed for Suds if an xsi_type is specified, otherwise will be
        left unaltered.
    factory: The suds.client.Factory object which can create instances of the
        classes generated from the WSDL.
    parent: The parent object that contains the obj parameter to be inspected.

def _RecurseOverObject(obj, factory, parent=None):
  """Recurses over a nested structure to look for changes in Suds objects.

  Args:
    obj: A parameter for a SOAP request field which is to be inspected and
        will be packed for Suds if an xsi_type is specified, otherwise will be
        left unaltered.
    factory: The suds.client.Factory object which can create instances of the
        classes generated from the WSDL.
    parent: The parent object that contains the obj parameter to be inspected.
  """
  if _IsSudsIterable(obj):
    # Since in-place modification of the Suds object is taking place, the
    # iterator should be done over a frozen copy of the unpacked fields.
    copy_of_obj = tuple(obj)
    for item in copy_of_obj:
      if _IsSudsIterable(item):
        if 'xsi_type' in item:
          if isinstance(obj, tuple):
            parent[obj[0]] = _PackForSuds(obj[1], factory)
          else:
            obj.remove(item)
            obj.append(_PackForSuds(item, factory))
        _RecurseOverObject(item, factory, obj)