<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def is_feature_enabled(self, feature_key, user_id, attributes=None):
 """ Returns true if the feature is enabled for the given user. Args: feature_key: The key of the feature for which we are determining if it is enabled or not for the given user. user_id: ID for user. attributes: Dict representing user attributes. Returns: True if the feature is enabled for the user. False otherwise. """


    if not self.is_valid:
      self.logger.error(enums.Errors.INVALID_DATAFILE.format('is_feature_enabled'))
      return False

    if not validator.is_non_empty_string(feature_key):
      self.logger.error(enums.Errors.INVALID_INPUT_ERROR.format('feature_key'))
      return False

    if not isinstance(user_id, string_types):
      self.logger.error(enums.Errors.INVALID_INPUT_ERROR.format('user_id'))
      return False

    if not self._validate_user_inputs(attributes):
      return False

    feature = self.config.get_feature_from_key(feature_key)
    if not feature:
      return False

    feature_enabled = False
    source_info = {}
    decision = self.decision_service.get_variation_for_feature(feature, user_id, attributes)
    is_source_experiment = decision.source == enums.DecisionSources.FEATURE_TEST

    if decision.variation:
      if decision.variation.featureEnabled is True:
        feature_enabled = True
      # Send event if Decision came from an experiment.
      if is_source_experiment:
        source_info = {
          'experiment_key': decision.experiment.key,
          'variation_key': decision.variation.key
        }
        self._send_impression_event(decision.experiment,
                                    decision.variation,
                                    user_id,
                                    attributes)

    if feature_enabled:
      self.logger.info('Feature "%s" is enabled for user "%s".' % (feature_key, user_id))
    else:
      self.logger.info('Feature "%s" is not enabled for user "%s".' % (feature_key, user_id))

    self.notification_center.send_notifications(
        enums.NotificationTypes.DECISION,
        enums.DecisionNotificationTypes.FEATURE,
        user_id,
        attributes or {},
        {
          'feature_key': feature_key,
          'feature_enabled': feature_enabled,
          'source': decision.source,
          'source_info': source_info
        }
    )

    return feature_enabled