@@ -1983,7 +1983,7 @@ class ComputedVar(Var[RETURN_TYPE]):
1983
1983
_initial_value : RETURN_TYPE | types .Unset = dataclasses .field (default = types .Unset ())
1984
1984
1985
1985
# Explicit var dependencies to track
1986
- _static_deps : dict [str , set [str ]] = dataclasses .field (default_factory = dict )
1986
+ _static_deps : dict [str | None , set [str ]] = dataclasses .field (default_factory = dict )
1987
1987
1988
1988
# Whether var dependencies should be auto-determined
1989
1989
_auto_deps : bool = dataclasses .field (default = True )
@@ -2053,39 +2053,72 @@ def __init__(
2053
2053
2054
2054
object .__setattr__ (self , "_update_interval" , interval )
2055
2055
2056
- _static_deps = {}
2057
- if isinstance (deps , dict ):
2058
- # Assume a dict is coming from _replace, so no special processing.
2059
- _static_deps = deps
2060
- elif deps is not None :
2061
- for dep in deps :
2062
- if isinstance (dep , Var ):
2063
- state_name = (
2064
- all_var_data .state
2065
- if (all_var_data := dep ._get_all_var_data ())
2066
- and all_var_data .state
2067
- else None
2068
- )
2069
- if all_var_data is not None :
2070
- var_name = all_var_data .field_name
2071
- else :
2072
- var_name = dep ._js_expr
2073
- _static_deps .setdefault (state_name , set ()).add (var_name )
2074
- elif isinstance (dep , str ) and dep != "" :
2075
- _static_deps .setdefault (None , set ()).add (dep )
2076
- else :
2077
- raise TypeError (
2078
- "ComputedVar dependencies must be Var instances or var names (non-empty strings)."
2079
- )
2080
2056
object .__setattr__ (
2081
2057
self ,
2082
2058
"_static_deps" ,
2083
- _static_deps ,
2059
+ self . _calculate_static_deps ( deps ) ,
2084
2060
)
2085
2061
object .__setattr__ (self , "_auto_deps" , auto_deps )
2086
2062
2087
2063
object .__setattr__ (self , "_fget" , fget )
2088
2064
2065
+ def _calculate_static_deps (
2066
+ self ,
2067
+ deps : Union [List [Union [str , Var ]], dict [str | None , set [str ]]] | None = None ,
2068
+ ) -> dict [str | None , set [str ]]:
2069
+ """Calculate the static dependencies of the computed var from user input or existing dependencies.
2070
+
2071
+ Args:
2072
+ deps: The user input dependencies or existing dependencies.
2073
+
2074
+ Returns:
2075
+ The static dependencies.
2076
+ """
2077
+ if isinstance (deps , dict ):
2078
+ # Assume a dict is coming from _replace, so no special processing.
2079
+ return deps
2080
+ _static_deps = {}
2081
+ if deps is not None :
2082
+ for dep in deps :
2083
+ _static_deps = self ._add_static_dep (dep , _static_deps )
2084
+ return _static_deps
2085
+
2086
+ def _add_static_dep (
2087
+ self , dep : Union [str , Var ], deps : dict [str | None , set [str ]] | None = None
2088
+ ) -> dict [str | None , set [str ]]:
2089
+ """Add a static dependency to the computed var or existing dependency set.
2090
+
2091
+ Args:
2092
+ dep: The dependency to add.
2093
+ deps: The existing dependency set.
2094
+
2095
+ Returns:
2096
+ The updated dependency set.
2097
+
2098
+ Raises:
2099
+ TypeError: If the computed var dependencies are not Var instances or var names.
2100
+ """
2101
+ if deps is None :
2102
+ deps = self ._static_deps
2103
+ if isinstance (dep , Var ):
2104
+ state_name = (
2105
+ all_var_data .state
2106
+ if (all_var_data := dep ._get_all_var_data ()) and all_var_data .state
2107
+ else None
2108
+ )
2109
+ if all_var_data is not None :
2110
+ var_name = all_var_data .field_name
2111
+ else :
2112
+ var_name = dep ._js_expr
2113
+ deps .setdefault (state_name , set ()).add (var_name )
2114
+ elif isinstance (dep , str ) and dep != "" :
2115
+ deps .setdefault (None , set ()).add (dep )
2116
+ else :
2117
+ raise TypeError (
2118
+ "ComputedVar dependencies must be Var instances or var names (non-empty strings)."
2119
+ )
2120
+ return deps
2121
+
2089
2122
@override
2090
2123
def _replace (
2091
2124
self ,
@@ -2106,6 +2139,8 @@ def _replace(
2106
2139
Raises:
2107
2140
TypeError: If kwargs contains keys that are not allowed.
2108
2141
"""
2142
+ if "deps" in kwargs :
2143
+ kwargs ["deps" ] = self ._calculate_static_deps (kwargs ["deps" ])
2109
2144
field_values = {
2110
2145
"fget" : kwargs .pop ("fget" , self ._fget ),
2111
2146
"initial_value" : kwargs .pop ("initial_value" , self ._initial_value ),
0 commit comments