2424logger = logging .getLogger (__name__ )
2525
2626
27- def _get_feature_flag (configuration : Mapping [str , Any ], feature_flag_name : str , reversed_feature_flags : Optional [ List ] = None ) -> Optional [FeatureFlag ]:
27+ def _get_feature_flag (configuration : Mapping [str , Any ], feature_flag_name : str ) -> Optional [FeatureFlag ]:
2828 """
2929 Gets the FeatureFlag json from the configuration, if it exists it gets converted to a FeatureFlag object.
3030 If multiple feature flags have the same id, the last one wins.
3131
3232 :param Mapping configuration: Configuration object.
3333 :param str feature_flag_name: Name of the feature flag.
34- :param List reversed_feature_flags: Optional pre-reversed list of feature flags for performance.
3534 :return: FeatureFlag
3635 :rtype: FeatureFlag
3736 """
@@ -41,21 +40,20 @@ def _get_feature_flag(configuration: Mapping[str, Any], feature_flag_name: str,
4140 feature_flags = feature_management .get (FEATURE_FLAG_KEY )
4241 if not feature_flags or not isinstance (feature_flags , list ):
4342 return None
44-
45- # Use pre-reversed list if available, otherwise reverse on demand
46- flags_to_iterate = reversed_feature_flags if reversed_feature_flags is not None else reversed (feature_flags )
4743
48- for feature_flag in flags_to_iterate :
49- if feature_flag .get ("id" ) == feature_flag_name :
50- return FeatureFlag .convert_from_json (feature_flag )
44+ index = len (feature_flags ) - 1
45+
46+ while index >= 0 :
47+ if feature_flags [index ].get ("id" ) == feature_flag_name :
48+ return FeatureFlag .convert_from_json (feature_flags [index ])
49+ index -= 1
5150
5251 return None
5352
5453
5554def _list_feature_flag_names (configuration : Mapping [str , Any ]) -> List [str ]:
5655 """
57- List of all feature flag names. If there are duplicate names, only unique names are returned
58- in order of first appearance.
56+ List of feature flag names, with duplicates removed.
5957
6058 :param Mapping configuration: Configuration object.
6159 :return: List of feature flag names.
@@ -67,7 +65,6 @@ def _list_feature_flag_names(configuration: Mapping[str, Any]) -> List[str]:
6765 if not feature_flags or not isinstance (feature_flags , list ):
6866 return []
6967
70- # Use dict.fromkeys() to preserve order while ensuring uniqueness
7168 flag_ids = [feature_flag .get ("id" ) for feature_flag in feature_flags ]
7269 return list (dict .fromkeys (flag_ids ))
7370
@@ -83,25 +80,10 @@ def __init__(self, configuration: Mapping[str, Any], **kwargs: Any):
8380 self ._configuration = configuration
8481 self ._cache : Dict [str , Optional [FeatureFlag ]] = {}
8582 self ._copy = configuration .get (FEATURE_MANAGEMENT_KEY )
86- self ._reversed_feature_flags : Optional [List ] = None
8783 self ._on_feature_evaluated = kwargs .pop ("on_feature_evaluated" , None )
8884 self ._targeting_context_accessor : Optional [Callable [[], TargetingContext ]] = kwargs .pop (
8985 "targeting_context_accessor" , None
9086 )
91- self ._update_reversed_feature_flags ()
92-
93- def _update_reversed_feature_flags (self ) -> None :
94- """Update the cached reversed feature flags list when configuration changes."""
95- feature_management = self ._configuration .get (FEATURE_MANAGEMENT_KEY )
96- if not feature_management or not isinstance (feature_management , Mapping ):
97- self ._reversed_feature_flags = None
98- return
99- feature_flags = feature_management .get (FEATURE_FLAG_KEY )
100- if not feature_flags or not isinstance (feature_flags , list ):
101- self ._reversed_feature_flags = None
102- return
103-
104- self ._reversed_feature_flags = list (reversed (feature_flags ))
10587
10688 @staticmethod
10789 def _assign_default_disabled_variant (evaluation_event : EvaluationEvent ) -> None :
@@ -289,10 +271,9 @@ def _check_feature_base(self, feature_flag_id: str) -> Tuple[EvaluationEvent, bo
289271 if self ._copy is not self ._configuration .get (FEATURE_MANAGEMENT_KEY ):
290272 self ._cache = {}
291273 self ._copy = self ._configuration .get (FEATURE_MANAGEMENT_KEY )
292- self ._update_reversed_feature_flags ()
293274
294275 if not self ._cache .get (feature_flag_id ):
295- feature_flag = _get_feature_flag (self ._configuration , feature_flag_id , self . _reversed_feature_flags )
276+ feature_flag = _get_feature_flag (self ._configuration , feature_flag_id )
296277 self ._cache [feature_flag_id ] = feature_flag
297278 else :
298279 feature_flag = self ._cache .get (feature_flag_id )
0 commit comments