From 1d23ed03b95b72ddfcdd87d3ab51056fcceba85b Mon Sep 17 00:00:00 2001 From: ipeluffo Date: Tue, 14 Apr 2026 11:02:26 +0100 Subject: [PATCH] Refactor `Dependant._uses_scopes` property for improved memory usage ``` Samples: 200000 - current=318.4 MB peak=318.4 MB Samples: 100000 - current=159.2 MB peak=159.2 MB Samples: 50000 - current=79.6 MB peak=79.6 MB Samples: 1000 - current=1.6 MB peak=1.6 MB Samples: 500 - current=0.8 MB peak=0.8 MB ``` --- fastapi/dependencies/models.py | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/fastapi/dependencies/models.py b/fastapi/dependencies/models.py index a79ca84351..9bfff02a77 100644 --- a/fastapi/dependencies/models.py +++ b/fastapi/dependencies/models.py @@ -52,6 +52,7 @@ class Dependant: # Lazy cached fields _oauth_scopes_cache: list[str] = field(default=None, init=False, repr=False) _cache_key_cache: DependencyCacheKey = field(default=None, init=False, repr=False) + _uses_scopes_cache: bool = field(default=None, init=False, repr=False) @property def oauth_scopes(self) -> list[str]: @@ -79,18 +80,25 @@ class Dependant: return self._cache_key_cache - @cached_property + @property def _uses_scopes(self) -> bool: - if self.own_oauth_scopes: - return True - if self.security_scopes_param_name is not None: - return True - if self._is_security_scheme: - return True - for sub_dep in self.dependencies: - if sub_dep._uses_scopes: - return True - return False + if self._uses_scopes_cache is None: + if self.own_oauth_scopes: + self._uses_scopes_cache = True + elif self.security_scopes_param_name is not None: + self._uses_scopes_cache = True + elif self._is_security_scheme: + self._uses_scopes_cache = True + + for sub_dep in self.dependencies: + if sub_dep._uses_scopes: + self._uses_scopes_cache = True + break + + if self._uses_scopes_cache is None: + self._uses_scopes_cache = False + + return self._uses_scopes_cache @cached_property def _is_security_scheme(self) -> bool: