code: def UpsertItem(self, database_or_Container_link, document, options=None):
          
          # Python's default arguments are evaluated once when the function is defined, not each time the function is called (like it is in say, Ruby). 
          # This means that if you use a mutable default argument and mutate it, you will and have mutated that object for all future calls to the function as well.
          # So, using a non-mutable deafult in this case(None) and assigning an empty dict(mutable) inside the method
          # For more details on this gotcha, please refer http://docs.python-guide.org/en/latest/writing/gotchas/
          if options is None:
              options = {}
  
          # We check the link to be document collection link since it can be database link in case of client side partitioning
          if(base.IsItemContainerLink(database_or_Container_link)):
              options = self._AddPartitionKey(database_or_Container_link, document, options)
  
          collection_id, document, path = self._GetContainerIdWithPathForItem(database_or_Container_link, document, options)
          return self.Upsert(document,
                             path,
                             'docs',
                             collection_id,
                             None,
                             options)
docs: Upserts a document in a collection.
  
          :param str database_or_Container_link:
              The link to the database when using partitioning, otherwise link to the document collection.
          :param dict document:
              The Azure Cosmos document to upsert.
          :param dict options:
              The request options for the request.
          :param bool options['disableAutomaticIdGeneration']:
              Disables the automatic id generation. If id is missing in the body and this
              option is true, an error will be returned.
  
          :return:
              The upserted Document.
          :rtype:
              dict