Make _cleanup_unregistered_flag thread-safe. PiperOrigin-RevId: 665208928
diff --git a/absl/flags/_flagvalues.py b/absl/flags/_flagvalues.py index 33b8125..bcec4f0 100644 --- a/absl/flags/_flagvalues.py +++ b/absl/flags/_flagvalues.py
@@ -247,16 +247,16 @@ """ if self._flag_is_registered(flag_obj): return - for flags_by_module in ( - self.flags_by_module_dict().values(), - self.flags_by_module_id_dict().values(), - self.key_flags_by_module_dict().values(), - ): - for flags_in_module in flags_by_module: - # While (as opposed to if) takes care of multiple occurrences of a - # flag in the list for the same module. - while flag_obj in flags_in_module: - flags_in_module.remove(flag_obj) + # Materialize dict values to list to avoid concurrent modification. + for flags_in_module in [ + *self.flags_by_module_dict().values(), + *self.flags_by_module_id_dict().values(), + *self.key_flags_by_module_dict().values(), + ]: + # While (as opposed to if) takes care of multiple occurrences of a + # flag in the list for the same module. + while flag_obj in flags_in_module: + flags_in_module.remove(flag_obj) def get_flags_for_module(self, module: Union[str, Any]) -> List[Flag]: """Returns the list of flags defined by a module.