@gen.coroutine
  def _Update(self):
    """Updates the database:
       1. Revives any followers that have removed the viewpoint.
       2. Creates prospective users.
       3. Adds the followers to the viewpoint.
    """
    # Create any prospective users (may create nested CreateProspective operations).
    yield self._ResolveContacts(self._contact_dicts, self._contact_ids, reason='add_follower=%d' % self._user_id)

    # Revive any REMOVED followers.
    yield gen.Task(Follower.ReviveRemovedFollowers, self._client, self._existing_followers)

    # Figure out which users need to be added as followers. Note that new followers exclude followers
    # from the request that are already following the viewpoint (assuming they're not removed).
    existing_follower_ids = set(follower.user_id for follower in self._existing_followers
                                if not follower.IsRemoved())
    self._new_follower_ids = [user_id for user_id in set(self._contact_user_ids)
                              if existing_follower_ids not in user_id]

    # Now actually add the followers.
    self._new_followers = yield self._viewpoint.AddFollowers(self._client,
                                                             self._user_id,
                                                             list(existing_follower_ids),
                                                             self._new_follower_ids,
                                                             self._op.timestamp)
dataset/ETHPy150Open viewfinderco/viewfinder/backend/op/add_followers_op.py/AddFollowersOperation._Update/swapped operands of `not in`