if transport is not None:
transport.__exit__(exc_type, exc_value, traceback)
- def __del__(self) -> None:
- # We use 'getattr' here, to manage the case where '__del__()' is called
- # on a partially initiallized instance that raised an exception during
- # the call to '__init__()'.
- if getattr(self, "_state", None) == ClientState.OPENED: # noqa: B009
- self.close()
-
class AsyncClient(BaseClient):
"""
for proxy in self._mounts.values():
if proxy is not None:
await proxy.__aexit__(exc_type, exc_value, traceback)
-
- def __del__(self) -> None:
- # We use 'getattr' here, to manage the case where '__del__()' is called
- # on a partially initiallized instance that raised an exception during
- # the call to '__init__()'.
- if getattr(self, "_state", None) == ClientState.OPENED: # noqa: B009
- # Unlike the sync case, we cannot silently close the client when
- # it is garbage collected, because `.aclose()` is an async operation,
- # but `__del__` is not.
- #
- # For this reason we require explicit close management for
- # `AsyncClient`, and issue a warning on unclosed clients.
- #
- # The context managed style is usually preferable, because it neatly
- # ensures proper resource cleanup:
- #
- # async with httpx.AsyncClient() as client:
- # ...
- #
- # However, an explicit call to `aclose()` is also sufficient:
- #
- # client = httpx.AsyncClient()
- # try:
- # ...
- # finally:
- # await client.aclose()
- warnings.warn(
- f"Unclosed {self!r}. "
- "See https://www.python-httpx.org/async/#opening-and-closing-clients "
- "for details."
- )
await client.get("http://example.com")
-@pytest.mark.usefixtures("async_environment")
-async def test_deleting_unclosed_async_client_causes_warning():
- client = httpx.AsyncClient(transport=httpx.MockTransport(hello_world))
- await client.get("http://example.com")
- with pytest.warns(UserWarning):
- del client
-
-
def unmounted(request: httpx.Request) -> httpx.Response:
data = {"app": "unmounted"}
return httpx.Response(200, json=data)