@@ -398,50 +398,28 @@ def capture(
398398 extra_properties : dict [str , Any ] = {}
399399 feature_variants : Optional [dict [str , Union [bool , str ]]] = {}
400400
401- # Parse send_feature_flags parameter
402- should_send_flags = False
403- only_evaluate_locally = None
404- flag_person_properties = None
405- flag_group_properties = None
401+ # Parse and normalize send_feature_flags parameter
402+ flag_options = self ._parse_send_feature_flags (send_feature_flags )
406403
407- if isinstance (send_feature_flags , dict ):
408- # SendFeatureFlagsOptions object
409- should_send_flags = True
410- only_evaluate_locally = send_feature_flags .get ("only_evaluate_locally" )
411- flag_person_properties = send_feature_flags .get ("person_properties" )
412- flag_group_properties = send_feature_flags .get ("group_properties" )
413- elif send_feature_flags :
414- # Boolean True
415- should_send_flags = True
416-
417- if should_send_flags :
404+ if flag_options ["should_send" ]:
418405 try :
419- if only_evaluate_locally is True :
406+ if flag_options [ " only_evaluate_locally" ] is True :
420407 # Only use local evaluation
421408 feature_variants = self .get_all_flags (
422409 distinct_id ,
423410 groups = (groups or {}),
424- person_properties = flag_person_properties ,
425- group_properties = flag_group_properties ,
411+ person_properties = flag_options [ "person_properties" ] ,
412+ group_properties = flag_options [ "group_properties" ] ,
426413 disable_geoip = disable_geoip ,
427414 only_evaluate_locally = True ,
428415 )
429- elif only_evaluate_locally is False :
430- # Force remote evaluation via /decide
431- feature_variants = self .get_feature_variants (
432- distinct_id ,
433- groups ,
434- person_properties = flag_person_properties ,
435- group_properties = flag_group_properties ,
436- disable_geoip = disable_geoip ,
437- )
438416 else :
439417 # Default behavior - use remote evaluation
440418 feature_variants = self .get_feature_variants (
441419 distinct_id ,
442420 groups ,
443- person_properties = flag_person_properties ,
444- group_properties = flag_group_properties ,
421+ person_properties = flag_options [ "person_properties" ] ,
422+ group_properties = flag_options [ "group_properties" ] ,
445423 disable_geoip = disable_geoip ,
446424 )
447425 except Exception as e :
@@ -474,6 +452,42 @@ def capture(
474452
475453 return self ._enqueue (msg , disable_geoip )
476454
455+ def _parse_send_feature_flags (self , send_feature_flags ) -> dict :
456+ """
457+ Parse and normalize send_feature_flags parameter into a standard format.
458+
459+ Args:
460+ send_feature_flags: Either bool or SendFeatureFlagsOptions dict
461+
462+ Returns:
463+ dict: Normalized options with keys: should_send, only_evaluate_locally,
464+ person_properties, group_properties
465+
466+ Raises:
467+ TypeError: If send_feature_flags is not bool or dict
468+ """
469+ if isinstance (send_feature_flags , dict ):
470+ return {
471+ "should_send" : True ,
472+ "only_evaluate_locally" : send_feature_flags .get (
473+ "only_evaluate_locally"
474+ ),
475+ "person_properties" : send_feature_flags .get ("person_properties" ),
476+ "group_properties" : send_feature_flags .get ("group_properties" ),
477+ }
478+ elif isinstance (send_feature_flags , bool ):
479+ return {
480+ "should_send" : send_feature_flags ,
481+ "only_evaluate_locally" : None ,
482+ "person_properties" : None ,
483+ "group_properties" : None ,
484+ }
485+ else :
486+ raise TypeError (
487+ f"Invalid type for send_feature_flags: { type (send_feature_flags )} . "
488+ f"Expected bool or dict."
489+ )
490+
477491 def set (self , ** kwargs : Unpack [OptionalSetArgs ]) -> Optional [str ]:
478492 distinct_id = kwargs .get ("distinct_id" , None )
479493 properties = kwargs .get ("properties" , None )
0 commit comments