'Opens many urns efficiently, returning cached objects when possible.'

def MultiOpen(self, urns, aff4_type=None, mode='r'):

    not_opened_urns = []
    aff4_type = _ValidateAFF4Type(aff4_type)
    for urn in urns:
        key = self._ObjectKey(urn, mode)
        try:
            result = self._objects_cache[key]
            if ((aff4_type is not None) and (not isinstance(result, aff4_type))):
                continue
            (yield result)
        except KeyError:
            not_opened_urns.append(urn)
    if not_opened_urns:
        for obj in FACTORY.MultiOpen(not_opened_urns, follow_symlinks=False, mode=mode, token=self._token):
            key = self._ObjectKey(obj.urn, mode)
            self._objects_cache[key] = obj
            if ((aff4_type is not None) and (not isinstance(obj, aff4_type))):
                continue
            (yield obj)
