Skip to content

Commit 25548bb

Browse files
gh-144386: Update equivalent code for "with", "async with" and "async for"
They use special method lookup for special methods.
1 parent f73d2e7 commit 25548bb

File tree

1 file changed

+19
-15
lines changed

1 file changed

+19
-15
lines changed

Doc/reference/compound_stmts.rst

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -544,21 +544,24 @@ The following code::
544544
is semantically equivalent to::
545545

546546
manager = (EXPRESSION)
547-
enter = type(manager).__enter__
548-
exit = type(manager).__exit__
549-
value = enter(manager)
547+
enter = manager.__enter__
548+
exit = manager.__exit__
549+
value = enter()
550550
hit_except = False
551551

552552
try:
553553
TARGET = value
554554
SUITE
555555
except:
556556
hit_except = True
557-
if not exit(manager, *sys.exc_info()):
557+
if not exit(*sys.exc_info()):
558558
raise
559559
finally:
560560
if not hit_except:
561-
exit(manager, None, None, None)
561+
exit(None, None, None)
562+
563+
except that implicit :ref:`special method lookup <special-lookup>` is used
564+
for :meth:`~object.__enter__` and :meth:`~object.__exit__`.
562565

563566
With more than one item, the context managers are processed as if multiple
564567
:keyword:`with` statements were nested::
@@ -1679,21 +1682,21 @@ The following code::
16791682

16801683
Is semantically equivalent to::
16811684

1682-
iter = (ITER)
1683-
iter = type(iter).__aiter__(iter)
1685+
iter = (ITER).__aiter__()
16841686
running = True
16851687

16861688
while running:
16871689
try:
1688-
TARGET = await type(iter).__anext__(iter)
1690+
TARGET = await iter.__anext__()
16891691
except StopAsyncIteration:
16901692
running = False
16911693
else:
16921694
SUITE
16931695
else:
16941696
SUITE2
16951697

1696-
See also :meth:`~object.__aiter__` and :meth:`~object.__anext__` for details.
1698+
except that implicit :ref:`special method lookup <special-lookup>` is used
1699+
for :meth:`~object.__aiter__` and :meth:`~object.__anext__`.
16971700

16981701
It is a :exc:`SyntaxError` to use an ``async for`` statement outside the
16991702
body of a coroutine function.
@@ -1719,23 +1722,24 @@ The following code::
17191722
is semantically equivalent to::
17201723

17211724
manager = (EXPRESSION)
1722-
aenter = type(manager).__aenter__
1723-
aexit = type(manager).__aexit__
1724-
value = await aenter(manager)
1725+
aenter = manager.__aenter__
1726+
aexit = manager.__aexit__
1727+
value = await aenter()
17251728
hit_except = False
17261729

17271730
try:
17281731
TARGET = value
17291732
SUITE
17301733
except:
17311734
hit_except = True
1732-
if not await aexit(manager, *sys.exc_info()):
1735+
if not await aexit(*sys.exc_info()):
17331736
raise
17341737
finally:
17351738
if not hit_except:
1736-
await aexit(manager, None, None, None)
1739+
await aexit(None, None, None)
17371740

1738-
See also :meth:`~object.__aenter__` and :meth:`~object.__aexit__` for details.
1741+
except that implicit :ref:`special method lookup <special-lookup>` is used
1742+
for :meth:`~object.__aenter__` and :meth:`~object.__aexit__`.
17391743

17401744
It is a :exc:`SyntaxError` to use an ``async with`` statement outside the
17411745
body of a coroutine function.

0 commit comments

Comments
 (0)