From cc5e739d76b46ee6d4de9cd444939f0833713680 Mon Sep 17 00:00:00 2001 From: BobTheBuidler Date: Mon, 19 May 2025 21:01:48 +0000 Subject: [PATCH 1/2] feat: cache error and null result formatters --- web3/_utils/method_formatters.py | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/web3/_utils/method_formatters.py b/web3/_utils/method_formatters.py index d66852ed9d..d746fe8fdd 100644 --- a/web3/_utils/method_formatters.py +++ b/web3/_utils/method_formatters.py @@ -120,6 +120,8 @@ TValue = TypeVar("TValue") +CachedFormatters = Dict[RPCEndpoint, Callable[[RPCResponse], Any]] + def bytes_to_ascii(value: bytes) -> str: return codecs.decode(value, "ascii") @@ -1258,17 +1260,28 @@ def get_result_formatters( return compose(*partial_formatters, *formatters) +_error_formatters: CachedFormatters = {} + def get_error_formatters(method_name: RPCEndpoint) -> Callable[[RPCResponse], Any]: # Note error formatters work on the full response dict - error_formatter_maps = (ERROR_FORMATTERS,) - formatters = combine_formatters(error_formatter_maps, method_name) + try: + return _error_formatters[method_name] + except KeyError: + formatters = _error_formatters[method_name] = compose( + *combine_formatters((ERROR_FORMATTERS,), method_name) + ) + return formatters - return compose(*formatters) +_null_result_formatters: CachedFormatters = {} def get_null_result_formatters( method_name: RPCEndpoint, ) -> Callable[[RPCResponse], Any]: - formatters = combine_formatters((NULL_RESULT_FORMATTERS,), method_name) - - return compose(*formatters) + try: + return _null_result_formatters[method_name] + except KeyError: + formatters = _null_result_formatters[method_name] = compose( + *combine_formatters((NULL_RESULT_FORMATTERS,), method_name) + ) + return formatters From 198e295d5427963793d5dab314f2de38cbd4e9ce Mon Sep 17 00:00:00 2001 From: BobTheBuidler <70677534+BobTheBuidler@users.noreply.github.com> Date: Mon, 19 May 2025 17:08:20 -0400 Subject: [PATCH 2/2] Update method_formatters.py --- web3/_utils/method_formatters.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/web3/_utils/method_formatters.py b/web3/_utils/method_formatters.py index d746fe8fdd..d42017b923 100644 --- a/web3/_utils/method_formatters.py +++ b/web3/_utils/method_formatters.py @@ -1262,6 +1262,7 @@ def get_result_formatters( _error_formatters: CachedFormatters = {} + def get_error_formatters(method_name: RPCEndpoint) -> Callable[[RPCResponse], Any]: # Note error formatters work on the full response dict try: @@ -1275,6 +1276,7 @@ def get_error_formatters(method_name: RPCEndpoint) -> Callable[[RPCResponse], An _null_result_formatters: CachedFormatters = {} + def get_null_result_formatters( method_name: RPCEndpoint, ) -> Callable[[RPCResponse], Any]: