@@ -495,23 +495,25 @@ def flush(self):
495495 return
496496 return self ._event_processor .flush ()
497497
498- def variation (self , key : str , context : Context , default : Any ) -> Any :
498+ def variation (self , key : str , context : Context , default : Any , send_events : bool = True ) -> Any :
499499 """Calculates the value of a feature flag for a given context.
500500
501501 :param key: the unique key for the feature flag
502502 :param context: the evaluation context
503503 :param default: the default value of the flag, to be used if the value is not
504504 available from LaunchDarkly
505+ :param send_events: whether to send evaluation events to LaunchDarkly. Defaults to True.
506+ Set to False to evaluate the flag without generating analytics events.
505507 :return: the variation for the given context, or the ``default`` value if the flag cannot be evaluated
506508 """
507509
508510 def evaluate ():
509- detail , _ = self ._evaluate_internal (key , context , default , self ._event_factory_default )
511+ detail , _ = self ._evaluate_internal (key , context , default , self ._event_factory_default , send_events )
510512 return _EvaluationWithHookResult (evaluation_detail = detail )
511513
512514 return self .__evaluate_with_hooks (key = key , context = context , default_value = default , method = "variation" , block = evaluate ).evaluation_detail .value
513515
514- def variation_detail (self , key : str , context : Context , default : Any ) -> EvaluationDetail :
516+ def variation_detail (self , key : str , context : Context , default : Any , send_events : bool = True ) -> EvaluationDetail :
515517 """Calculates the value of a feature flag for a given context, and returns an object that
516518 describes the way the value was determined.
517519
@@ -522,12 +524,14 @@ def variation_detail(self, key: str, context: Context, default: Any) -> Evaluati
522524 :param context: the evaluation context
523525 :param default: the default value of the flag, to be used if the value is not
524526 available from LaunchDarkly
527+ :param send_events: whether to send evaluation events to LaunchDarkly. Defaults to True.
528+ Set to False to evaluate the flag without generating analytics events.
525529 :return: an :class:`ldclient.evaluation.EvaluationDetail` object that includes the feature
526530 flag value and evaluation reason
527531 """
528532
529533 def evaluate ():
530- detail , _ = self ._evaluate_internal (key , context , default , self ._event_factory_with_reasons )
534+ detail , _ = self ._evaluate_internal (key , context , default , self ._event_factory_with_reasons , send_events )
531535 return _EvaluationWithHookResult (evaluation_detail = detail )
532536
533537 return self .__evaluate_with_hooks (key = key , context = context , default_value = default , method = "variation_detail" , block = evaluate ).evaluation_detail
@@ -562,7 +566,7 @@ def evaluate():
562566 hook_result = self .__evaluate_with_hooks (key = key , context = context , default_value = default_stage .value , method = "migration_variation" , block = evaluate )
563567 return hook_result .results ['default_stage' ], hook_result .results ['tracker' ]
564568
565- def _evaluate_internal (self , key : str , context : Context , default : Any , event_factory ) -> Tuple [EvaluationDetail , Optional [FeatureFlag ]]:
569+ def _evaluate_internal (self , key : str , context : Context , default : Any , event_factory , send_events : bool = True ) -> Tuple [EvaluationDetail , Optional [FeatureFlag ]]:
566570 default = self ._config .get_default (key , default )
567571
568572 if self ._config .offline :
@@ -574,7 +578,8 @@ def _evaluate_internal(self, key: str, context: Context, default: Any, event_fac
574578 else :
575579 log .warning ("Feature Flag evaluation attempted before client has initialized! Feature store unavailable - returning default: " + str (default ) + " for feature key: " + key )
576580 reason = error_reason ('CLIENT_NOT_READY' )
577- self ._send_event (event_factory .new_unknown_flag_event (key , context , default , reason ))
581+ if send_events :
582+ self ._send_event (event_factory .new_unknown_flag_event (key , context , default , reason ))
578583 return EvaluationDetail (default , None , reason ), None
579584
580585 if not context .valid :
@@ -587,27 +592,32 @@ def _evaluate_internal(self, key: str, context: Context, default: Any, event_fac
587592 log .error ("Unexpected error while retrieving feature flag \" %s\" : %s" % (key , repr (e )))
588593 log .debug (traceback .format_exc ())
589594 reason = error_reason ('EXCEPTION' )
590- self ._send_event (event_factory .new_unknown_flag_event (key , context , default , reason ))
595+ if send_events :
596+ self ._send_event (event_factory .new_unknown_flag_event (key , context , default , reason ))
591597 return EvaluationDetail (default , None , reason ), None
592598 if not flag :
593599 reason = error_reason ('FLAG_NOT_FOUND' )
594- self ._send_event (event_factory .new_unknown_flag_event (key , context , default , reason ))
600+ if send_events :
601+ self ._send_event (event_factory .new_unknown_flag_event (key , context , default , reason ))
595602 return EvaluationDetail (default , None , reason ), None
596603 else :
597604 try :
598605 result = self ._evaluator .evaluate (flag , context , event_factory )
599- for event in result .events or []:
600- self ._send_event (event )
606+ if send_events :
607+ for event in result .events or []:
608+ self ._send_event (event )
601609 detail = result .detail
602610 if detail .is_default_value ():
603611 detail = EvaluationDetail (default , None , detail .reason )
604- self ._send_event (event_factory .new_eval_event (flag , context , detail , default ))
612+ if send_events :
613+ self ._send_event (event_factory .new_eval_event (flag , context , detail , default ))
605614 return detail , flag
606615 except Exception as e :
607616 log .error ("Unexpected error while evaluating feature flag \" %s\" : %s" % (key , repr (e )))
608617 log .debug (traceback .format_exc ())
609618 reason = error_reason ('EXCEPTION' )
610- self ._send_event (event_factory .new_default_event (flag , context , default , reason ))
619+ if send_events :
620+ self ._send_event (event_factory .new_default_event (flag , context , default , reason ))
611621 return EvaluationDetail (default , None , reason ), flag
612622
613623 def all_flags_state (self , context : Context , ** kwargs ) -> FeatureFlagsState :
0 commit comments