Prechádzať zdrojové kódy

make vardata merge not use classmethod (#4245)

* make vardata merge not use classmethod

* add clarifying comment

* use simple cases for small values

* add possible None

* allow zero values to be given to var data

* dang it darglint
Khaleel Al-Adhami 7 mesiacov pred
rodič
commit
ab4fd41e55
1 zmenil súbory, kde vykonal 29 pridanie a 18 odobranie
  1. 29 18
      reflex/vars/base.py

+ 29 - 18
reflex/vars/base.py

@@ -151,31 +151,41 @@ class VarData:
         """
         return dict((k, list(v)) for k, v in self.imports)
 
-    @classmethod
-    def merge(cls, *others: VarData | None) -> VarData | None:
+    def merge(*all: VarData | None) -> VarData | None:
         """Merge multiple var data objects.
 
         Args:
-            *others: The var data objects to merge.
+            *all: The var data objects to merge.
 
         Returns:
             The merged var data object.
+
+        # noqa: DAR102 *all
         """
-        state = ""
-        field_name = ""
-        _imports = {}
-        hooks = {}
-        for var_data in others:
-            if var_data is None:
-                continue
-            state = state or var_data.state
-            field_name = field_name or var_data.field_name
-            _imports = imports.merge_imports(_imports, var_data.imports)
-            hooks.update(
-                var_data.hooks
-                if isinstance(var_data.hooks, dict)
-                else {k: None for k in var_data.hooks}
-            )
+        all_var_datas = list(filter(None, all))
+
+        if not all_var_datas:
+            return None
+
+        if len(all_var_datas) == 1:
+            return all_var_datas[0]
+
+        # Get the first non-empty field name or default to empty string.
+        field_name = next(
+            (var_data.field_name for var_data in all_var_datas if var_data.field_name),
+            "",
+        )
+
+        # Get the first non-empty state or default to empty string.
+        state = next(
+            (var_data.state for var_data in all_var_datas if var_data.state), ""
+        )
+
+        hooks = {hook: None for var_data in all_var_datas for hook in var_data.hooks}
+
+        _imports = imports.merge_imports(
+            *(var_data.imports for var_data in all_var_datas)
+        )
 
         if state or _imports or hooks or field_name:
             return VarData(
@@ -184,6 +194,7 @@ class VarData:
                 imports=_imports,
                 hooks=hooks,
             )
+
         return None
 
     def __bool__(self) -> bool: