@utilities.arguments_not_none<EOL><INDENT>def remove_asset(self, asset_id, composition_id):<DEDENT>
if (not isinstance(composition_id, ABCId) and<EOL>composition_id.get_identifier_namespace() != '<STR_LIT>'):<EOL><INDENT>raise errors.InvalidArgument('<STR_LIT>')<EOL><DEDENT>composition_map, collection = self._get_composition_collection(composition_id)<EOL>try:<EOL><INDENT>composition_map['<STR_LIT>'].remove(str(asset_id))<EOL><DEDENT>except (KeyError, ValueError):<EOL><INDENT>raise errors.NotFound()<EOL><DEDENT>collection.save(composition_map)<EOL>
Removes an ``Asset`` from a ``Composition``.

        arg:    asset_id (osid.id.Id): ``Id`` of the ``Asset``
        arg:    composition_id (osid.id.Id): ``Id`` of the
                ``Composition``
        raise:  NotFound - ``asset_id``  ``not found in composition_id``
        raise:  NullArgument - ``asset_id`` or ``composition_id`` is
                ``null``
        raise:  OperationFailed - unable to complete request
        raise:  PermissionDenied - authorization fauilure
        *compliance: mandatory -- This method must be implemented.*