@@ -139,45 +139,43 @@ def evaluate_features(
139139 context : EvaluationContext [typing .Any , FeatureMetadataT ],
140140 segment_overrides : SegmentOverrides [FeatureMetadataT ],
141141) -> dict [str , FlagResult [FeatureMetadataT ]]:
142+ if not (features := context .get ("features" )):
143+ return {}
144+
142145 flags : dict [str , FlagResult [FeatureMetadataT ]] = {}
143146
144- for feature_context in ( context . get ( " features" ) or {}) .values ():
147+ for feature_context in features .values ():
145148 feature_name = feature_context ["name" ]
146- if segment_override := segment_overrides .get (
147- feature_context ["name" ],
148- ):
149- feature_context = segment_override ["feature_context" ]
150- flag_result : FlagResult [FeatureMetadataT ]
151- flags [feature_name ] = flag_result = {
152- "enabled" : feature_context ["enabled" ],
153- "name" : feature_context ["name" ],
154- "reason" : f"TARGETING_MATCH; segment={ segment_override ['segment_name' ]} " ,
155- "value" : feature_context .get ("value" ),
156- }
157- if feature_metadata := feature_context .get ("metadata" ):
158- flag_result ["metadata" ] = feature_metadata
149+ if segment_override := segment_overrides .get (feature_name ):
150+ flags [feature_name ] = get_flag_result_from_context (
151+ context = context ,
152+ feature_context = segment_override ["feature_context" ],
153+ reason = f"TARGETING_MATCH; segment={ segment_override ['segment_name' ]} " ,
154+ )
159155 continue
160156 flags [feature_name ] = get_flag_result_from_context (
161157 context = context ,
162- feature_name = feature_name ,
158+ feature_context = context ["features" ][feature_name ],
159+ reason = "DEFAULT" ,
163160 )
164161
165162 return flags
166163
167164
168165def get_flag_result_from_context (
169- context : EvaluationContext [typing .Any , FeatureMetadataT ],
170- feature_name : str ,
166+ context : _EvaluationContextAnyMeta ,
167+ feature_context : FeatureContext [FeatureMetadataT ],
168+ reason : str ,
171169) -> FlagResult [FeatureMetadataT ]:
172170 """
173171 Get a feature value from the evaluation context
174172 for a given feature name.
175173
176- :param context: the evaluation context
177- :param feature_name: the feature name to get the value for
174+ :param context: evaluation context
175+ :param feature_context: feature context
176+ :param reason: reason to use when no variant selected
178177 :return: the value for the feature name in the evaluation context
179178 """
180- feature_context = context ["features" ][feature_name ]
181179 key = _get_identity_key (context )
182180
183181 flag_result : typing .Optional [FlagResult [FeatureMetadataT ]] = None
@@ -209,7 +207,7 @@ def get_flag_result_from_context(
209207 flag_result = {
210208 "enabled" : feature_context ["enabled" ],
211209 "name" : feature_context ["name" ],
212- "reason" : "DEFAULT" ,
210+ "reason" : reason ,
213211 "value" : feature_context ["value" ],
214212 }
215213
0 commit comments