Skip to content

Commit e9cae46

Browse files
authored
Avoid caching the constructed URL when altering the query string (#1436)
1 parent 0d1c8b7 commit e9cae46

File tree

2 files changed

+16
-5
lines changed

2 files changed

+16
-5
lines changed

CHANGES/1436.misc.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
1434.misc.rst

yarl/_url.py

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -246,8 +246,9 @@ def build_pre_encoded_url(
246246
return self
247247

248248

249-
@lru_cache
250-
def from_parts(scheme: str, netloc: str, path: str, query: str, fragment: str) -> "URL":
249+
def from_parts_uncached(
250+
scheme: str, netloc: str, path: str, query: str, fragment: str
251+
) -> "URL":
251252
"""Create a new URL from parts."""
252253
self = object.__new__(URL)
253254
self._scheme = scheme
@@ -259,6 +260,9 @@ def from_parts(scheme: str, netloc: str, path: str, query: str, fragment: str) -
259260
return self
260261

261262

263+
from_parts = lru_cache(from_parts_uncached)
264+
265+
262266
@rewrite_module
263267
class URL:
264268
# Don't derive from str
@@ -1170,7 +1174,9 @@ def with_query(self, *args: Any, **kwargs: Any) -> "URL":
11701174
"""
11711175
# N.B. doesn't cleanup query/fragment
11721176
query = get_str_query(*args, **kwargs) or ""
1173-
return from_parts(self._scheme, self._netloc, self._path, query, self._fragment)
1177+
return from_parts_uncached(
1178+
self._scheme, self._netloc, self._path, query, self._fragment
1179+
)
11741180

11751181
@overload
11761182
def extend_query(self, query: Query) -> "URL": ...
@@ -1196,7 +1202,9 @@ def extend_query(self, *args: Any, **kwargs: Any) -> "URL":
11961202
query += new_query if query[-1] == "&" else f"&{new_query}"
11971203
else:
11981204
query = new_query
1199-
return from_parts(self._scheme, self._netloc, self._path, query, self._fragment)
1205+
return from_parts_uncached(
1206+
self._scheme, self._netloc, self._path, query, self._fragment
1207+
)
12001208

12011209
@overload
12021210
def update_query(self, query: Query) -> "URL": ...
@@ -1253,7 +1261,9 @@ def update_query(self, *args: Any, **kwargs: Any) -> "URL":
12531261
"Invalid query type: only str, mapping or "
12541262
"sequence of (key, value) pairs is allowed"
12551263
)
1256-
return from_parts(self._scheme, self._netloc, self._path, query, self._fragment)
1264+
return from_parts_uncached(
1265+
self._scheme, self._netloc, self._path, query, self._fragment
1266+
)
12571267

12581268
def without_query_params(self, *query_params: str) -> "URL":
12591269
"""Remove some keys from query part and return new URL."""

0 commit comments

Comments
 (0)