Update the binary data of an Attachment, and optionally the comment and the minor edit field.

        This adds a new version of the attachment, containing the new binary data, filename, and content-type.

        When updating the binary data of an attachment, the comment related to it together with the field that
        specifies if it's a minor edit can be updated as well, but are not required. If an update is considered to be a
        minor edit, notifications will not be sent to the watchers of that content.
        :param content_id (string): A string containing the id of the attachments content container.
        :param attachment_id (string): The id of the attachment to upload a new file for.
        :param attachment (dict): The dictionary describing the attachment to upload. The dict must have a key "file",
                                  which has a value that is an I/O object (file, StringIO, etc.), and can also
                                  have a "comment" key describing the attachment, and a "minorEdit" key, which is a
                                  boolean used to flag that the changes to the attachment are not substantial.
        :param callback: OPTIONAL: The callback to execute on the resulting data, before the method returns.
                         Default: None (no callback, raw data returned).
        :return: The JSON data returned from the content/{content_id}/child/attachment/{attachment_id}/data endpoint,
                 or the results of the callback. Will raise requests.HTTPError on bad input, potentially.

def update_attachment(self, content_id, attachment_id, attachment, callback=None):
        """
        Update the binary data of an Attachment, and optionally the comment and the minor edit field.

        This adds a new version of the attachment, containing the new binary data, filename, and content-type.

        When updating the binary data of an attachment, the comment related to it together with the field that
        specifies if it's a minor edit can be updated as well, but are not required. If an update is considered to be a
        minor edit, notifications will not be sent to the watchers of that content.
        :param content_id (string): A string containing the id of the attachments content container.
        :param attachment_id (string): The id of the attachment to upload a new file for.
        :param attachment (dict): The dictionary describing the attachment to upload. The dict must have a key "file",
                                  which has a value that is an I/O object (file, StringIO, etc.), and can also
                                  have a "comment" key describing the attachment, and a "minorEdit" key, which is a
                                  boolean used to flag that the changes to the attachment are not substantial.
        :param callback: OPTIONAL: The callback to execute on the resulting data, before the method returns.
                         Default: None (no callback, raw data returned).
        :return: The JSON data returned from the content/{content_id}/child/attachment/{attachment_id}/data endpoint,
                 or the results of the callback. Will raise requests.HTTPError on bad input, potentially.
        """
        if isinstance(attachment, dict):
            assert "file" in list(attachment.keys())
        else:
            assert False
        return self._service_post_request("rest/api/content/{content_id}/child/attachment/{attachment_id}/data"
                                          "".format(content_id=content_id, attachment_id=attachment_id),
                                          headers={"X-Atlassian-Token": "nocheck"}, files=attachment,
                                          callback=callback)