Dont perform implicit close/warning on __del__ (#2026)

* Version 0.21.3

* Don't perform implict close on __del__
This commit is contained in:
Tom Christie 2022-01-13 10:37:37 +00:00 committed by GitHub
parent 0f1ff50a1e
commit 7f0d43daad
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 0 additions and 46 deletions

View File

@ -1273,13 +1273,6 @@ class Client(BaseClient):
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):
"""
@ -1983,34 +1976,3 @@ 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."
)

View File

@ -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)