Improve performance of deprecated spider arg checks. (#7045)

This commit is contained in:
Andrey Rakhmatullin 2025-10-03 17:17:46 +05:00 committed by GitHub
parent dd0b071bcc
commit 798390c096
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 14 additions and 4 deletions

View File

@ -28,9 +28,15 @@ class StatsCollector:
self._crawler: Crawler = crawler
def __getattribute__(self, name):
cached_name = f"_cached_{name}"
try:
return super().__getattribute__(cached_name)
except AttributeError:
pass
original_attr = super().__getattribute__(name)
if name in (
if name in {
"get_value",
"get_stats",
"set_value",
@ -41,8 +47,10 @@ class StatsCollector:
"clear_stats",
"open_spider",
"close_spider",
) and callable(original_attr):
return _warn_spider_arg(original_attr)
} and callable(original_attr):
wrapped = _warn_spider_arg(original_attr)
setattr(self, cached_name, wrapped)
return wrapped
return original_attr

View File

@ -93,8 +93,10 @@ def _warn_spider_arg(
):
"""Decorator to warn if a ``spider`` argument is passed to a function."""
sig = inspect.signature(func)
def check_args(*args: _P.args, **kwargs: _P.kwargs) -> None:
bound = inspect.signature(func).bind(*args, **kwargs)
bound = sig.bind(*args, **kwargs)
if "spider" in bound.arguments:
warnings.warn(
f"Passing a 'spider' argument to {func.__qualname__}() is deprecated and "