Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Dont perform implicit close/warning on __del__ #2026

Merged
merged 4 commits into from Jan 13, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
38 changes: 0 additions & 38 deletions httpx/_client.py
Expand Up @@ -1273,13 +1273,6 @@ def __exit__(
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):
"""
Expand Down Expand Up @@ -1983,34 +1976,3 @@ async def __aexit__(
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."
)
8 changes: 0 additions & 8 deletions tests/client/test_async_client.py
Expand Up @@ -286,14 +286,6 @@ async def test_client_closed_state_using_with_block():
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)
Expand Down