Skip to content

Commit fc8d277

Browse files
committed
Use as_tuple_of_middlewares() to get around typing issues
- Use an internal method for the ``NamedMiddlewareOnion`` to generate the tuple of middlewares, instead of relying on ``tuple()``.
1 parent c3894c6 commit fc8d277

File tree

4 files changed

+29
-21
lines changed

4 files changed

+29
-21
lines changed

web3/datastructures.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,14 @@ def _replace_with_new_name(self, old: TKey, new: TKey) -> None:
268268
self._queue.move_to_end(key)
269269
del self._queue[old]
270270

271+
def as_tuple_of_middlewares(self) -> Tuple[TValue, ...]:
272+
"""
273+
This helps with type hinting since we return `Iterator[TKey]` type, though it's
274+
actually a `Iterator[TValue]` type, for the `__iter__()` method. This is in
275+
order to satisfy the `Mapping` interface.
276+
"""
277+
return tuple(self._queue.values())
278+
271279
def __iter__(self) -> Iterator[TKey]:
272280
elements = self._queue.values()
273281
if not isinstance(elements, Sequence):

web3/providers/async_base.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -85,17 +85,16 @@ def __init__(self) -> None:
8585
self._request_cache = SimpleCache(1000)
8686

8787
async def request_func(
88-
self, async_w3: "AsyncWeb3", middlewares: MiddlewareOnion
88+
self, async_w3: "AsyncWeb3", middleware_onion: MiddlewareOnion
8989
) -> Callable[..., Coroutine[Any, Any, RPCResponse]]:
90-
# type ignored b/c tuple(MiddlewareOnion) converts to tuple of middlewares
91-
middlewares: Tuple[Middleware, ...] = tuple(middlewares) # type: ignore
90+
middlewares: Tuple[Middleware, ...] = middleware_onion.as_tuple_of_middlewares()
9291

9392
cache_key = self._request_func_cache[0]
94-
if cache_key != middlewares: # type: ignore
93+
if cache_key != middlewares:
9594
self._request_func_cache = (
9695
middlewares,
9796
await async_combine_middlewares(
98-
middlewares=middlewares, # type: ignore
97+
middlewares=middlewares,
9998
async_w3=async_w3,
10099
provider_request_fn=self.make_request,
101100
),

web3/providers/base.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -82,24 +82,23 @@ def __init__(self) -> None:
8282
self._request_cache = SimpleCache(1000)
8383

8484
def request_func(
85-
self, w3: "Web3", middlewares: MiddlewareOnion
85+
self, w3: "Web3", middleware_onion: MiddlewareOnion
8686
) -> Callable[..., RPCResponse]:
8787
"""
8888
@param w3 is the web3 instance
89-
@param middlewares is an iterable of middlewares,
89+
@param middleware_onion is an iterable of middlewares,
9090
ordered by first to execute
9191
@returns a function that calls all the middleware and
9292
eventually self.make_request()
9393
"""
94-
# type ignored b/c tuple(MiddlewareOnion) converts to tuple of middlewares
95-
middlewares: Tuple[Middleware] = tuple(middlewares) # type: ignore
94+
middlewares: Tuple[Middleware, ...] = middleware_onion.as_tuple_of_middlewares()
9695

9796
cache_key = self._request_func_cache[0]
98-
if cache_key != middlewares: # type: ignore
97+
if cache_key != middlewares:
9998
self._request_func_cache = (
10099
middlewares,
101100
combine_middlewares(
102-
middlewares=middlewares, # type: ignore
101+
middlewares=middlewares,
103102
w3=w3,
104103
provider_request_fn=self.make_request,
105104
),

web3/providers/eth_tester/main.py

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -79,19 +79,20 @@ def __init__(self) -> None:
7979
self.api_endpoints = API_ENDPOINTS
8080

8181
async def request_func(
82-
self, async_w3: "AsyncWeb3", middlewares: "MiddlewareOnion"
82+
self, async_w3: "AsyncWeb3", middleware_onion: "MiddlewareOnion"
8383
) -> Callable[..., Coroutine[Any, Any, RPCResponse]]:
8484
# override the request_func to add the ethereum_tester_middleware
8585

86-
# type ignored bc tuple(MiddlewareOnion) converts to tuple of middlewares
87-
middlewares = tuple(middlewares) + tuple(self._middlewares) # type: ignore
86+
middlewares = middleware_onion.as_tuple_of_middlewares() + tuple(
87+
self._middlewares
88+
)
8889

8990
cache_key = self._request_func_cache[0]
90-
if cache_key != middlewares: # type: ignore
91+
if cache_key != middlewares:
9192
self._request_func_cache = (
9293
middlewares,
9394
await async_combine_middlewares(
94-
middlewares=middlewares, # type: ignore
95+
middlewares=middlewares,
9596
async_w3=async_w3,
9697
provider_request_fn=self.make_request,
9798
),
@@ -154,19 +155,20 @@ def __init__(
154155
self.api_endpoints = api_endpoints
155156

156157
def request_func(
157-
self, w3: "Web3", middlewares: "MiddlewareOnion"
158+
self, w3: "Web3", middleware_onion: "MiddlewareOnion"
158159
) -> Callable[..., RPCResponse]:
159160
# override the request_func to add the ethereum_tester_middleware
160161

161-
# type ignored bc tuple(MiddlewareOnion) converts to tuple of middlewares
162-
middlewares = tuple(middlewares) + tuple(self._middlewares) # type: ignore
162+
middlewares = middleware_onion.as_tuple_of_middlewares() + tuple(
163+
self._middlewares
164+
)
163165

164166
cache_key = self._request_func_cache[0]
165-
if cache_key != middlewares: # type: ignore
167+
if cache_key != middlewares:
166168
self._request_func_cache = (
167169
middlewares,
168170
combine_middlewares(
169-
middlewares=middlewares, # type: ignore
171+
middlewares=middlewares,
170172
w3=w3,
171173
provider_request_fn=self.make_request,
172174
),

0 commit comments

Comments
 (0)