Initialize the var dependency tracking dicts. Allows the state to know which vars each ComputedVar depends on and whether a ComputedVar depends on a var in its parent state. Additional updates tracking dicts for vars and substates that always need to be recomputed.
(cls)
| 887 | |
| 888 | @classmethod |
| 889 | def _init_var_dependency_dicts(cls): |
| 890 | """Initialize the var dependency tracking dicts. |
| 891 | |
| 892 | Allows the state to know which vars each ComputedVar depends on and |
| 893 | whether a ComputedVar depends on a var in its parent state. |
| 894 | |
| 895 | Additional updates tracking dicts for vars and substates that always |
| 896 | need to be recomputed. |
| 897 | """ |
| 898 | for cvar_name, cvar in cls.computed_vars.items(): |
| 899 | if not cvar._cache: |
| 900 | # Do not perform dep calculation when cache=False (these are always dirty). |
| 901 | continue |
| 902 | for state_name, dvar_set in cvar._deps(objclass=cls).items(): |
| 903 | state_cls = cls.get_root_state().get_class_substate(state_name) |
| 904 | for dvar in dvar_set: |
| 905 | defining_state_cls = state_cls |
| 906 | while dvar in { |
| 907 | *defining_state_cls.inherited_vars, |
| 908 | *defining_state_cls.inherited_backend_vars, |
| 909 | }: |
| 910 | parent_state = defining_state_cls.get_parent_state() |
| 911 | if parent_state is not None: |
| 912 | defining_state_cls = parent_state |
| 913 | defining_state_cls._var_dependencies.setdefault(dvar, set()).add(( |
| 914 | cls.get_full_name(), |
| 915 | cvar_name, |
| 916 | )) |
| 917 | defining_state_cls._potentially_dirty_states.add( |
| 918 | cls.get_full_name() |
| 919 | ) |
| 920 | |
| 921 | # ComputedVar with cache=False always need to be recomputed |
| 922 | cls._always_dirty_computed_vars = { |
| 923 | cvar_name |
| 924 | for cvar_name, cvar in cls.computed_vars.items() |
| 925 | if not cvar._cache |
| 926 | } |
| 927 | |
| 928 | # Any substate containing a ComputedVar with cache=False always needs to be recomputed |
| 929 | if cls._always_dirty_computed_vars: |
| 930 | # Tell parent classes that this substate has always dirty computed vars |
| 931 | state_name = cls.get_name() |
| 932 | parent_state = cls.get_parent_state() |
| 933 | while parent_state is not None: |
| 934 | parent_state._always_dirty_substates.add(state_name) |
| 935 | state_name, parent_state = ( |
| 936 | parent_state.get_name(), |
| 937 | parent_state.get_parent_state(), |
| 938 | ) |
| 939 | |
| 940 | # Reset cached schema value |
| 941 | cls._to_schema.cache_clear() |
| 942 | |
| 943 | @classmethod |
| 944 | def _check_overridden_methods(cls): |