[ Web Proxy ]
URL:
Viewing: https://raw.githubusercontent.com/python/python-docs-ko/3.14/library/contextlib.po [Back]  [Original]

# SOME DESCRIPTIVE TITLE.
# Copyright (C) 2001-2017, Python Software Foundation
# This file is distributed under the same license as the Python package.
# FIRST AUTHOR , 2017.
#
msgid ""
msgstr ""
"Project-Id-Version: Python 3.6\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-04-17 23:44+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Dong-gweon Oh \n"
"Language-Team: Korean (https://python.flowdas.com)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.17.0\n"

#: ../../library/contextlib.rst:2
msgid ""
":mod:`!contextlib` --- Utilities for :keyword:`!with`\\ -statement "
"contexts"
msgstr ":mod:`!contextlib` --- :keyword:`!with`    "

#: ../../library/contextlib.rst:7
msgid "**Source code:** :source:`Lib/contextlib.py`"
msgstr "** :** :source:`Lib/contextlib.py`"

#: ../../library/contextlib.rst:11
msgid ""
"This module provides utilities for common tasks involving the "
":keyword:`with` statement. For more information see also "
":ref:`typecontextmanager` and :ref:`context-managers`."
msgstr ""
"  :keyword:`with`       .   "
":ref:`typecontextmanager`  :ref:`context-managers`\\ ."

#: ../../library/contextlib.rst:17
msgid "Utilities"
msgstr ""

#: ../../library/contextlib.rst:19
msgid "Functions and classes provided:"
msgstr "  :"

#: ../../library/contextlib.rst:23
msgid ""
"An :term:`abstract base class` for classes that implement "
":meth:`object.__enter__` and :meth:`object.__exit__`. A default "
"implementation for :meth:`object.__enter__` is provided which returns "
"``self`` while :meth:`object.__exit__` is an abstract method which by "
"default returns ``None``. See also the definition of "
":ref:`typecontextmanager`."
msgstr ""
":meth:`object.__enter__`\\ :meth:`object.__exit__`\\   "
":term:`   `. ``self``\\  "
":meth:`object.__enter__`\\    :meth:`object.__exit__`\\ "
" ``None``\\   . :ref:`typecontextmanager`   ."

#: ../../library/contextlib.rst:34
msgid ""
"An :term:`abstract base class` for classes that implement "
":meth:`object.__aenter__` and :meth:`object.__aexit__`. A default "
"implementation for :meth:`object.__aenter__` is provided which returns "
"``self`` while :meth:`object.__aexit__` is an abstract method which by "
"default returns ``None``. See also the definition of :ref:`async-context-"
"managers`."
msgstr ""
":meth:`object.__aenter__`\\ :meth:`object.__aexit__`\\   "
":term:`   `. ``self``\\  "
":meth:`object.__aenter__`\\    :meth:`object.__aexit__`\\ "
" ``None``\\   . :ref:`async-context-managers`\\  "
"."

#: ../../library/contextlib.rst:46
msgid ""
"This function is a :term:`decorator` that can be used to define a factory"
" function for :keyword:`with` statement context managers, without needing"
" to create a class or separate :meth:`~object.__enter__` and "
":meth:`~object.__exit__` methods."
msgstr ""
"    :meth:`~object.__enter__`\\ :meth:`~object.__exit__` "
"   , :keyword:`with`            "
":term:` `\\."

#: ../../library/contextlib.rst:50
msgid ""
"While many objects natively support use in with statements, sometimes a "
"resource needs to be managed that isn't a context manager in its own "
"right, and doesn't implement a ``close()`` method for use with "
"``contextlib.closing``."
msgstr ""
"   with   ,     "
"``contextlib.closing``\\   ``close()``       "
" ."

#: ../../library/contextlib.rst:54
msgid ""
"An abstract example would be the following to ensure correct resource "
"management::"
msgstr "        ::"

#: ../../library/contextlib.rst:57
msgid ""
"from contextlib import contextmanager\n"
"\n"
"@contextmanager\n"
"def managed_resource(*args, **kwds):\n"
"    # Code to acquire resource, e.g.:\n"
"    resource = acquire_resource(*args, **kwds)\n"
"    try:\n"
"        yield resource\n"
"    finally:\n"
"        # Code to release resource, e.g.:\n"
"        release_resource(resource)"
msgstr ""
"from contextlib import contextmanager\n"
"\n"
"@contextmanager\n"
"def managed_resource(*args, **kwds):\n"
"    #   ,  :\n"
"    resource = acquire_resource(*args, **kwds)\n"
"    try:\n"
"        yield resource\n"
"    finally:\n"
"        #   ,  :\n"
"        release_resource(resource)"

#: ../../library/contextlib.rst:69
msgid "The function can then be used like this::"
msgstr ""

#: ../../library/contextlib.rst:71
msgid ""
">>> with managed_resource(timeout=3600) as resource:\n"
"...     # Resource is released at the end of this block,\n"
"...     # even if code in the block raises an exception"
msgstr ""
">>> with managed_resource(timeout=3600) as resource:\n"
"...     #    ,\n"
"...     #     "

#: ../../library/contextlib.rst:75
msgid ""
"The function being decorated must return a :term:`generator`-iterator "
"when called. This iterator must yield exactly one value, which will be "
"bound to the targets in the :keyword:`with` statement's :keyword:`!as` "
"clause, if any."
msgstr ""
"     :term:` `   .   "
"    ,  :keyword:`with`  :keyword:`!as`     "
"()."

#: ../../library/contextlib.rst:79
msgid ""
"At the point where the generator yields, the block nested in the "
":keyword:`with` statement is executed.  The generator is then resumed "
"after the block is exited. If an unhandled exception occurs in the block,"
" it is reraised inside the generator at the point where the yield "
"occurred.  Thus, you can use a :keyword:`try`...\\ :keyword:`except`...\\"
" :keyword:`finally` statement to trap the error (if any), or ensure that "
"some cleanup takes place. If an exception is trapped merely in order to "
"log it or to perform some action (rather than to suppress it entirely), "
"the generator must reraise that exception. Otherwise the generator "
"context manager will indicate to the :keyword:`!with` statement that the "
"exception has been handled, and execution will resume with the statement "
"immediately following the :keyword:`!with` statement."
msgstr ""
"  , :keyword:`with`    .      "
" .     ,   yield    . "
", :keyword:`try`...\\ :keyword:`except`...\\ :keyword:`finally`  "
" () ,      .       (  "
" )            .   "
"   :keyword:`!with`    , :keyword:`!with`  "
"     ."

#: ../../library/contextlib.rst:91
msgid ""
":func:`contextmanager` uses :class:`ContextDecorator` so the context "
"managers it creates can be used as decorators as well as in "
":keyword:`with` statements. When used as a decorator, a new generator "
"instance is implicitly created on each function call (this allows the "
"otherwise \"one-shot\" context managers created by :func:`contextmanager`"
" to meet the requirement that context managers support multiple "
"invocations in order to be used as decorators)."
msgstr ""
":func:`contextmanager`\\ :class:`ContextDecorator`\\ ,   "
" :keyword:`with`      .   ,   "
"      (    :func:`contextmanager`\\  "
" \"\"              "
"    ) ."

#: ../../library/contextlib.rst:98
msgid "Use of :class:`ContextDecorator`."
msgstr ":class:`ContextDecorator` ."

#: ../../library/contextlib.rst:104
msgid ""
"Similar to :func:`~contextlib.contextmanager`, but creates an "
":ref:`asynchronous context manager `."
msgstr ""
":func:`~contextlib.contextmanager`\\ , :ref:`   `\\ ."

#: ../../library/contextlib.rst:107
msgid ""
"This function is a :term:`decorator` that can be used to define a factory"
" function for :keyword:`async with` statement asynchronous context "
"managers, without needing to create a class or separate "
":meth:`~object.__aenter__` and :meth:`~object.__aexit__` methods. It must"
" be applied to an :term:`asynchronous generator` function."
msgstr ""
"    :meth:`~object.__aenter__`\\ :meth:`~object.__aexit__` "
"   , :keyword:`async with`          "
"   :term:` `\\. :term:`  `   ."

#: ../../library/contextlib.rst:113
msgid "A simple example::"
msgstr " ::"

#: ../../library/contextlib.rst:115
msgid ""
"from contextlib import asynccontextmanager\n"
"\n"
"@asynccontextmanager\n"
"async def get_connection():\n"
"    conn = await acquire_db_connection()\n"
"    try:\n"
"        yield conn\n"
"    finally:\n"
"        await release_db_connection(conn)\n"
"\n"
"async def get_all_users():\n"
"    async with get_connection() as conn:\n"
"        return conn.query('SELECT ...')"
msgstr ""
"from contextlib import asynccontextmanager\n"
"\n"
"@asynccontextmanager\n"
"async def get_connection():\n"
"    conn = await acquire_db_connection()\n"
"    try:\n"
"        yield conn\n"
"    finally:\n"
"        await release_db_connection(conn)\n"
"\n"
"async def get_all_users():\n"
"    async with get_connection() as conn:\n"
"        return conn.query('SELECT ...')"

#: ../../library/contextlib.rst:131
msgid ""
"Context managers defined with :func:`asynccontextmanager` can be used "
"either as decorators or with :keyword:`async with` statements::"
msgstr ""

#: ../../library/contextlib.rst:134
#, python-brace-format
msgid ""
"import time\n"
"from contextlib import asynccontextmanager\n"
"\n"
"@asynccontextmanager\n"
"async def timeit():\n"
"    now = time.monotonic()\n"
"    try:\n"
"        yield\n"
"    finally:\n"
"        print(f'it took {time.monotonic() - now}s to run')\n"
"\n"
"@timeit()\n"
"async def main():\n"
"    # ... async code ..."
msgstr ""
"import time\n"
"from contextlib import asynccontextmanager\n"
"\n"
"@asynccontextmanager\n"
"async def timeit():\n"
"    now = time.monotonic()\n"
"    try:\n"
"        yield\n"
"    finally:\n"
"        print(f'it took {time.monotonic() - now}s to run')\n"
"\n"
"@timeit()\n"
"async def main():\n"
"    # ...   ..."

#: ../../library/contextlib.rst:149
msgid ""
"When used as a decorator, a new generator instance is implicitly created "
"on each function call. This allows the otherwise \"one-shot\" context "
"managers created by :func:`asynccontextmanager` to meet the requirement "
"that context managers support multiple invocations in order to be used as"
" decorators."
msgstr ""
"  ,        .     "
":func:`asynccontextmanager`\\   \"\"      "
"            ."

#: ../../library/contextlib.rst:154
msgid ""
"Async context managers created with :func:`asynccontextmanager` can be "
"used as decorators."
msgstr ""

#: ../../library/contextlib.rst:161
msgid ""
"Return a context manager that closes *thing* upon completion of the "
"block.  This is basically equivalent to::"
msgstr "   *thing*\\    .    ::"

#: ../../library/contextlib.rst:164
msgid ""
"from contextlib import contextmanager\n"
"\n"
"@contextmanager\n"
"def closing(thing):\n"
"    try:\n"
"        yield thing\n"
"    finally:\n"
"        thing.close()"
msgstr ""
"from contextlib import contextmanager\n"
"\n"
"@contextmanager\n"
"def closing(thing):\n"
"    try:\n"
"        yield thing\n"
"    finally:\n"
"        thing.close()"

#: ../../library/contextlib.rst:173
msgid "And lets you write code like this::"
msgstr "       ::"

#: ../../library/contextlib.rst:175
msgid ""
"from contextlib import closing\n"
"from urllib.request import urlopen\n"
"\n"
"with closing(urlopen('https://www.python.org')) as page:\n"
"    for line in page:\n"
"        print(line)"
msgstr ""
"from contextlib import closing\n"
"from urllib.request import urlopen\n"
"\n"
"with closing(urlopen('https://www.python.org')) as page:\n"
"    for line in page:\n"
"        print(line)"

#: ../../library/contextlib.rst:182
msgid ""
"without needing to explicitly close ``page``.  Even if an error occurs, "
"``page.close()`` will be called when the :keyword:`with` block is exited."
msgstr ""
"``page``\\    .  , :keyword:`with`    "
"``page.close()``\\ ."

#: ../../library/contextlib.rst:187
msgid ""
"Most types managing resources support the :term:`context manager` "
"protocol, which closes *thing* on leaving the :keyword:`with` statement. "
"As such, :func:`!closing` is most useful for third party types that don't"
" support context managers. This example is purely for illustration "
"purposes, as :func:`~urllib.request.urlopen` would normally be used in a "
"context manager."
msgstr ""

#: ../../library/contextlib.rst:196
msgid ""
"Return an async context manager that calls the ``aclose()`` method of "
"*thing* upon completion of the block.  This is basically equivalent to::"
msgstr ""
"   *thing*\\ ``aclose()``      .  "
"  ::"

#: ../../library/contextlib.rst:199
msgid ""
"from contextlib import asynccontextmanager\n"
"\n"
"@asynccontextmanager\n"
"async def aclosing(thing):\n"
"    try:\n"
"        yield thing\n"
"    finally:\n"
"        await thing.aclose()"
msgstr ""
"from contextlib import asynccontextmanager\n"
"\n"
"@asynccontextmanager\n"
"async def aclosing(thing):\n"
"    try:\n"
"        yield thing\n"
"    finally:\n"
"        await thing.aclose()"

#: ../../library/contextlib.rst:208
msgid ""
"Significantly, ``aclosing()`` supports deterministic cleanup of async "
"generators when they happen to exit early by :keyword:`break` or an "
"exception.  For example::"
msgstr ""

#: ../../library/contextlib.rst:212
msgid ""
"from contextlib import aclosing\n"
"\n"
"async with aclosing(my_generator()) as values:\n"
"    async for value in values:\n"
"        if value == 42:\n"
"            break"
msgstr ""
"from contextlib import aclosing\n"
"\n"
"async with aclosing(my_generator()) as values:\n"
"    async for value in values:\n"
"        if value == 42:\n"
"            break"

#: ../../library/contextlib.rst:219
msgid ""
"This pattern ensures that the generator's async exit code is executed in "
"the same context as its iterations (so that exceptions and context "
"variables work as expected, and the exit code isn't run after the "
"lifetime of some task it depends on)."
msgstr ""

#: ../../library/contextlib.rst:231
msgid ""
"Return a context manager that returns *enter_result* from ``__enter__``, "
"but otherwise does nothing. It is intended to be used as a stand-in for "
"an optional context manager, for example::"
msgstr ""
"``__enter__``\\ *enter_result*\\ ,        "
".        ,  ::"

#: ../../library/contextlib.rst:235
msgid ""
"def myfunction(arg, ignore_exceptions=False):\n"
"    if ignore_exceptions:\n"
"        # Use suppress to ignore all exceptions.\n"
"        cm = contextlib.suppress(Exception)\n"
"    else:\n"
"        # Do not ignore any exceptions, cm has no effect.\n"
"        cm = contextlib.nullcontext()\n"
"    with cm:\n"
"        # Do something"
msgstr ""
"def myfunction(arg, ignore_exceptions=False):\n"
"    if ignore_exceptions:\n"
"        #     suppress .\n"
"        cm = contextlib.suppress(Exception)\n"
"    else:\n"
"        #    , cm   .\n"
"        cm = contextlib.nullcontext()\n"
"    with cm:\n"
"        #  "

#: ../../library/contextlib.rst:245
msgid "An example using *enter_result*::"
msgstr "*enter_result*\\  ::"

#: ../../library/contextlib.rst:247
msgid ""
"def process_file(file_or_path):\n"
"    if isinstance(file_or_path, str):\n"
"        # If string, open file\n"
"        cm = open(file_or_path)\n"
"    else:\n"
"        # Caller is responsible for closing file\n"
"        cm = nullcontext(file_or_path)\n"
"\n"
"    with cm as file:\n"
"        # Perform processing on the file"
msgstr ""
"def process_file(file_or_path):\n"
"    if isinstance(file_or_path, str):\n"
"        # ,  \n"
"        cm = open(file_or_path)\n"
"    else:\n"
"        #     \n"
"        cm = nullcontext(file_or_path)\n"
"\n"
"    with cm as file:\n"
"        #    "

#: ../../library/contextlib.rst:258
msgid ""
"It can also be used as a stand-in for :ref:`asynchronous context managers"
" `::"
msgstr " :ref:`   `\\    ::"

#: ../../library/contextlib.rst:261
msgid ""
"async def send_http(session=None):\n"
"    if not session:\n"
"        # If no http session, create it with aiohttp\n"
"        cm = aiohttp.ClientSession()\n"
"    else:\n"
"        # Caller is responsible for closing the session\n"
"        cm = nullcontext(session)\n"
"\n"
"    async with cm as session:\n"
"        # Send http requests with session"
msgstr ""
"async def send_http(session=None):\n"
"    if not session:\n"
"        # http  , aiohttp  \n"
"        cm = aiohttp.ClientSession()\n"
"    else:\n"
"        #     \n"
"        cm = nullcontext(session)\n"
"\n"
"    async with cm as session:\n"
"        #  http  "

#: ../../library/contextlib.rst:274
msgid ":term:`asynchronous context manager` support was added."
msgstr ""

#: ../../library/contextlib.rst:281
msgid ""
"Return a context manager that suppresses any of the specified exceptions "
"if they occur in the body of a :keyword:`!with` statement and then "
"resumes execution with the first statement following the end of the "
":keyword:`!with` statement."
msgstr ""
":keyword:`!with`         :keyword:`!with`    "
"        ."

#: ../../library/contextlib.rst:286
msgid ""
"As with any other mechanism that completely suppresses exceptions, this "
"context manager should be used only to cover very specific errors where "
"silently continuing with program execution is known to be the right thing"
" to do."
msgstr ""
"     ,            "
"      ."

#: ../../library/contextlib.rst:291
msgid "For example::"
msgstr " ::"

#: ../../library/contextlib.rst:293
msgid ""
"from contextlib import suppress\n"
"\n"
"with suppress(FileNotFoundError):\n"
"    os.remove('somefile.tmp')\n"
"\n"
"with suppress(FileNotFoundError):\n"
"    os.remove('someotherfile.tmp')"
msgstr ""
"from contextlib import suppress\n"
"\n"
"with suppress(FileNotFoundError):\n"
"    os.remove('somefile.tmp')\n"
"\n"
"with suppress(FileNotFoundError):\n"
"    os.remove('someotherfile.tmp')"

#: ../../library/contextlib.rst:301
msgid "This code is equivalent to::"
msgstr "   ::"

#: ../../library/contextlib.rst:303
msgid ""
"try:\n"
"    os.remove('somefile.tmp')\n"
"except FileNotFoundError:\n"
"    pass\n"
"\n"
"try:\n"
"    os.remove('someotherfile.tmp')\n"
"except FileNotFoundError:\n"
"    pass"
msgstr ""
"try:\n"
"    os.remove('somefile.tmp')\n"
"except FileNotFoundError:\n"
"    pass\n"
"\n"
"try:\n"
"    os.remove('someotherfile.tmp')\n"
"except FileNotFoundError:\n"
"    pass"

#: ../../library/contextlib.rst:313 ../../library/contextlib.rst:362
#: ../../library/contextlib.rst:372 ../../library/contextlib.rst:389
msgid "This context manager is :ref:`reentrant `."
msgstr "   :ref:`  `\\."

#: ../../library/contextlib.rst:315
msgid ""
"If the code within the :keyword:`!with` block raises a "
":exc:`BaseExceptionGroup`, suppressed exceptions are removed from the "
"group.  Any exceptions of the group which are not suppressed are re-"
"raised in a new group which is created using the original group's "
":meth:`~BaseExceptionGroup.derive` method."
msgstr ""

#: ../../library/contextlib.rst:323
msgid ""
"``suppress`` now supports suppressing exceptions raised as part of a "
":exc:`BaseExceptionGroup`."
msgstr ""

#: ../../library/contextlib.rst:329
msgid ""
"Context manager for temporarily redirecting :data:`sys.stdout` to another"
" file or file-like object."
msgstr ":data:`sys.stdout`\\          ."

#: ../../library/contextlib.rst:332
msgid ""
"This tool adds flexibility to existing functions or classes whose output "
"is hardwired to stdout."
msgstr "   stdout      ."

#: ../../library/contextlib.rst:335
msgid ""
"For example, the output of :func:`help` normally is sent to *sys.stdout*."
" You can capture that output in a string by redirecting the output to an "
":class:`io.StringIO` object. The replacement stream is returned from the "
"``__enter__`` method and so is available as the target of the "
":keyword:`with` statement::"
msgstr ""
" , :func:`help`\\   *sys.stdout*\\ .  "
":class:`io.StringIO`          .   "
"``__enter__``   :keyword:`with`     ::"

#: ../../library/contextlib.rst:341
msgid ""
"with redirect_stdout(io.StringIO()) as f:\n"
"    help(pow)\n"
"s = f.getvalue()"
msgstr ""
"with redirect_stdout(io.StringIO()) as f:\n"
"    help(pow)\n"
"s = f.getvalue()"

#: ../../library/contextlib.rst:345
msgid ""
"To send the output of :func:`help` to a file on disk, redirect the output"
" to a regular file::"
msgstr ":func:`help`\\    ,     ::"

#: ../../library/contextlib.rst:348
msgid ""
"with open('help.txt', 'w') as f:\n"
"    with redirect_stdout(f):\n"
"        help(pow)"
msgstr ""
"with open('help.txt', 'w') as f:\n"
"    with redirect_stdout(f):\n"
"        help(pow)"

#: ../../library/contextlib.rst:352
msgid "To send the output of :func:`help` to *sys.stderr*::"
msgstr ":func:`help`\\  *sys.stderr*\\ ::"

#: ../../library/contextlib.rst:354
msgid ""
"with redirect_stdout(sys.stderr):\n"
"    help(pow)"
msgstr ""
"with redirect_stdout(sys.stderr):\n"
"    help(pow)"

#: ../../library/contextlib.rst:357
msgid ""
"Note that the global side effect on :data:`sys.stdout` means that this "
"context manager is not suitable for use in library code and most threaded"
" applications. It also has no effect on the output of subprocesses. "
"However, it is still a useful approach for many utility scripts."
msgstr ""
":data:`sys.stdout`\\             "
"   .       . ,    "
"  ."

#: ../../library/contextlib.rst:369
msgid ""
"Similar to :func:`~contextlib.redirect_stdout` but redirecting "
":data:`sys.stderr` to another file or file-like object."
msgstr ""
":func:`~contextlib.redirect_stdout`\\ , :data:`sys.stderr`\\  "
"    ."

#: ../../library/contextlib.rst:379
msgid ""
"Non parallel-safe context manager to change the current working "
"directory. As this changes a global state, the working directory, it is "
"not suitable for use in most threaded or async contexts. It is also not "
"suitable for most non-linear code execution, like generators, where the "
"program execution is temporarily relinquished -- unless explicitly "
"desired, you should not yield when this context manager is active."
msgstr ""

#: ../../library/contextlib.rst:386
msgid ""
"This is a simple wrapper around :func:`~os.chdir`, it changes the current"
" working directory upon entering and restores the old one on exit."
msgstr ""

#: ../../library/contextlib.rst:396
msgid ""
"A base class that enables a context manager to also be used as a "
"decorator."
msgstr "        ."

#: ../../library/contextlib.rst:398
msgid ""
"Context managers inheriting from ``ContextDecorator`` have to implement "
"``__enter__`` and ``__exit__`` as normal. ``__exit__`` retains its "
"optional exception handling even when used as a decorator."
msgstr ""
"``ContextDecorator``\\      ``__enter__``\\ "
"``__exit__``\\  . ``__exit__``\\       ."

#: ../../library/contextlib.rst:402
msgid ""
"``ContextDecorator`` is used by :func:`contextmanager`, so you get this "
"functionality automatically."
msgstr ""
"``ContextDecorator``\\ :func:`contextmanager`\\ ,     "
"."

#: ../../library/contextlib.rst:405
msgid "Example of ``ContextDecorator``::"
msgstr "``ContextDecorator``\\ ::"

#: ../../library/contextlib.rst:407
msgid ""
"from contextlib import ContextDecorator\n"
"\n"
"class mycontext(ContextDecorator):\n"
"    def __enter__(self):\n"
"        print('Starting')\n"
"        return self\n"
"\n"
"    def __exit__(self, *exc):\n"
"        print('Finishing')\n"
"        return False"
msgstr ""
"from contextlib import ContextDecorator\n"
"\n"
"class mycontext(ContextDecorator):\n"
"    def __enter__(self):\n"
"        print('Starting')\n"
"        return self\n"
"\n"
"    def __exit__(self, *exc):\n"
"        print('Finishing')\n"
"        return False"

#: ../../library/contextlib.rst:418 ../../library/contextlib.rst:490
msgid "The class can then be used like this::"
msgstr ""

#: ../../library/contextlib.rst:420
msgid ""
">>> @mycontext()\n"
"... def function():\n"
"...     print('The bit in the middle')\n"
"...\n"
">>> function()\n"
"Starting\n"
"The bit in the middle\n"
"Finishing\n"
"\n"
">>> with mycontext():\n"
"...     print('The bit in the middle')\n"
"...\n"
"Starting\n"
"The bit in the middle\n"
"Finishing"
msgstr ""
">>> @mycontext()\n"
"... def function():\n"
"...     print('The bit in the middle')\n"
"...\n"
">>> function()\n"
"Starting\n"
"The bit in the middle\n"
"Finishing\n"
"\n"
">>> with mycontext():\n"
"...     print('The bit in the middle')\n"
"...\n"
"Starting\n"
"The bit in the middle\n"
"Finishing"

#: ../../library/contextlib.rst:436
msgid ""
"This change is just syntactic sugar for any construct of the following "
"form::"
msgstr "         ::"

#: ../../library/contextlib.rst:438
msgid ""
"def f():\n"
"    with cm():\n"
"        # Do stuff"
msgstr ""
"def f():\n"
"    with cm():\n"
"        #  "

#: ../../library/contextlib.rst:442
msgid "``ContextDecorator`` lets you instead write::"
msgstr "``ContextDecorator``\\       ::"

#: ../../library/contextlib.rst:444
msgid ""
"@cm()\n"
"def f():\n"
"    # Do stuff"
msgstr ""
"@cm()\n"
"def f():\n"
"    #  "

#: ../../library/contextlib.rst:448
msgid ""
"It makes it clear that the ``cm`` applies to the whole function, rather "
"than just a piece of it (and saving an indentation level is nice, too)."
msgstr ""
"``cm``\\           (     "
")."

#: ../../library/contextlib.rst:451
msgid ""
"Existing context managers that already have a base class can be extended "
"by using ``ContextDecorator`` as a mixin class::"
msgstr ""
"       ``ContextDecorator``\\      "
"::"

#: ../../library/contextlib.rst:454
msgid ""
"from contextlib import ContextDecorator\n"
"\n"
"class mycontext(ContextBaseClass, ContextDecorator):\n"
"    def __enter__(self):\n"
"        return self\n"
"\n"
"    def __exit__(self, *exc):\n"
"        return False"
msgstr ""
"from contextlib import ContextDecorator\n"
"\n"
"class mycontext(ContextBaseClass, ContextDecorator):\n"
"    def __enter__(self):\n"
"        return self\n"
"\n"
"    def __exit__(self, *exc):\n"
"        return False"

#: ../../library/contextlib.rst:464
msgid ""
"As the decorated function must be able to be called multiple times, the "
"underlying context manager must support use in multiple :keyword:`with` "
"statements. If this is not the case, then the original construct with the"
" explicit :keyword:`!with` statement inside the function should be used."
msgstr ""
"        ,     :keyword:`with`   "
" .  ,    :keyword:`!with`      ."

#: ../../library/contextlib.rst:474
msgid "Similar to :class:`ContextDecorator` but only for asynchronous functions."
msgstr ":class:`ContextDecorator`\\ ,   ."

#: ../../library/contextlib.rst:476
msgid "Example of ``AsyncContextDecorator``::"
msgstr "``AsyncContextDecorator``\\ ::"

#: ../../library/contextlib.rst:478
msgid ""
"from asyncio import run\n"
"from contextlib import AsyncContextDecorator\n"
"\n"
"class mycontext(AsyncContextDecorator):\n"
"    async def __aenter__(self):\n"
"        print('Starting')\n"
"        return self\n"
"\n"
"    async def __aexit__(self, *exc):\n"
"        print('Finishing')\n"
"        return False"
msgstr ""
"from asyncio import run\n"
"from contextlib import AsyncContextDecorator\n"
"\n"
"class mycontext(AsyncContextDecorator):\n"
"    async def __aenter__(self):\n"
"        print('Starting')\n"
"        return self\n"
"\n"
"    async def __aexit__(self, *exc):\n"
"        print('Finishing')\n"
"        return False"

#: ../../library/contextlib.rst:492
msgid ""
">>> @mycontext()\n"
"... async def function():\n"
"...     print('The bit in the middle')\n"
"...\n"
">>> run(function())\n"
"Starting\n"
"The bit in the middle\n"
"Finishing\n"
"\n"
">>> async def function():\n"
"...    async with mycontext():\n"
"...         print('The bit in the middle')\n"
"...\n"
">>> run(function())\n"
"Starting\n"
"The bit in the middle\n"
"Finishing"
msgstr ""
">>> @mycontext()\n"
"... async def function():\n"
"...     print('The bit in the middle')\n"
"...\n"
">>> run(function())\n"
"Starting\n"
"The bit in the middle\n"
"Finishing\n"
"\n"
">>> async def function():\n"
"...    async with mycontext():\n"
"...         print('The bit in the middle')\n"
"...\n"
">>> run(function())\n"
"Starting\n"
"The bit in the middle\n"
"Finishing"

#: ../../library/contextlib.rst:515
msgid ""
"A context manager that is designed to make it easy to programmatically "
"combine other context managers and cleanup functions, especially those "
"that are optional or otherwise driven by input data."
msgstr ""
"    ,             "
"     ."

#: ../../library/contextlib.rst:519
msgid ""
"For example, a set of files may easily be handled in a single with "
"statement as follows::"
msgstr " ,      with     ::"

#: ../../library/contextlib.rst:522
msgid ""
"with ExitStack() as stack:\n"
"    files = [stack.enter_context(open(fname)) for fname in filenames]\n"
"    # All opened files will automatically be closed at the end of\n"
"    # the with statement, even if attempts to open files later\n"
"    # in the list raise an exception"
msgstr ""
"with ExitStack() as stack:\n"
"    files = [stack.enter_context(open(fname)) for fname in filenames]\n"
"    #      \n"
"    #  , with  \n"
"    #     ."

#: ../../library/contextlib.rst:528
msgid ""
"The :meth:`~object.__enter__` method returns the :class:`ExitStack` "
"instance, and performs no additional operations."
msgstr ""

#: ../../library/contextlib.rst:531
msgid ""
"Each instance maintains a stack of registered callbacks that are called "
"in reverse order when the instance is closed (either explicitly or "
"implicitly at the end of a :keyword:`with` statement). Note that "
"callbacks are *not* invoked implicitly when the context stack instance is"
" garbage collected."
msgstr ""
"     (  :keyword:`with`   )    "
"  .          **\\ ."

#: ../../library/contextlib.rst:536
msgid ""
"This stack model is used so that context managers that acquire their "
"resources in their ``__init__`` method (such as file objects) can be "
"handled correctly."
msgstr ""
"   ``__init__``     (  )     "
"."

#: ../../library/contextlib.rst:540
msgid ""
"Since registered callbacks are invoked in the reverse order of "
"registration, this ends up behaving as if multiple nested :keyword:`with`"
" statements had been used with the registered set of callbacks. This even"
" extends to exception handling - if an inner callback suppresses or "
"replaces an exception, then outer callbacks will be passed arguments "
"based on that updated state."
msgstr ""
"     ,    :keyword:`with`      "
"  .     -     ,      "
" ."

#: ../../library/contextlib.rst:547
msgid ""
"This is a relatively low level API that takes care of the details of "
"correctly unwinding the stack of exit callbacks. It provides a suitable "
"foundation for higher level context managers that manipulate the exit "
"stack in application specific ways."
msgstr ""
"          API.       "
"      ."

#: ../../library/contextlib.rst:556
msgid ""
"Enters a new context manager and adds its :meth:`~object.__exit__` method"
" to the callback stack. The return value is the result of the context "
"manager's own :meth:`~object.__enter__` method."
msgstr ""
"    :meth:`~object.__exit__`    .   "
"   :meth:`~object.__enter__`  ."

#: ../../library/contextlib.rst:560
msgid ""
"These context managers may suppress exceptions just as they normally "
"would if used directly as part of a :keyword:`with` statement."
msgstr ""
"   :keyword:`with`           "
" ."

#: ../../library/contextlib.rst:563
msgid ""
"Raises :exc:`TypeError` instead of :exc:`AttributeError` if *cm* is not a"
" context manager."
msgstr ""

#: ../../library/contextlib.rst:569
msgid ""
"Adds a context manager's :meth:`~object.__exit__` method to the callback "
"stack."
msgstr "  :meth:`~object.__exit__`    ."

#: ../../library/contextlib.rst:571
msgid ""
"As ``__enter__`` is *not* invoked, this method can be used to cover part "
"of an :meth:`~object.__enter__` implementation with a context manager's "
"own :meth:`~object.__exit__` method."
msgstr ""
"``__enter__``\\  ** ,       "
":meth:`~object.__exit__`  :meth:`~object.__enter__`   "
"(cover)    ."

#: ../../library/contextlib.rst:575
msgid ""
"If passed an object that is not a context manager, this method assumes it"
" is a callback with the same signature as a context manager's "
":meth:`~object.__exit__` method and adds it directly to the callback "
"stack."
msgstr ""
"    ,       :meth:`~object.__exit__` "
"          ."

#: ../../library/contextlib.rst:579
msgid ""
"By returning true values, these callbacks can suppress exceptions the "
"same way context manager :meth:`~object.__exit__` methods can."
msgstr ""
" ,     :meth:`~object.__exit__`      "
" ."

#: ../../library/contextlib.rst:582
msgid ""
"The passed in object is returned from the function, allowing this method "
"to be used as a function decorator."
msgstr "   ,        ."

#: ../../library/contextlib.rst:587
msgid ""
"Accepts an arbitrary callback function and arguments and adds it to the "
"callback stack."
msgstr "       ."

#: ../../library/contextlib.rst:590
msgid ""
"Unlike the other methods, callbacks added this way cannot suppress "
"exceptions (as they are never passed the exception details)."
msgstr "  ,         (     )."

#: ../../library/contextlib.rst:593
msgid ""
"The passed in callback is returned from the function, allowing this "
"method to be used as a function decorator."
msgstr "   ,        ."

#: ../../library/contextlib.rst:598
msgid ""
"Transfers the callback stack to a fresh :class:`ExitStack` instance and "
"returns it. No callbacks are invoked by this operation - instead, they "
"will now be invoked when the new stack is closed (either explicitly or "
"implicitly at the end of a :keyword:`with` statement)."
msgstr ""
"   :class:`ExitStack`    .      "
" - ,      ( :keyword:`with`   ) ."

#: ../../library/contextlib.rst:603
msgid ""
"For example, a group of files can be opened as an \"all or nothing\" "
"operation as follows::"
msgstr " ,     \"  \"    ::"

#: ../../library/contextlib.rst:606
msgid ""
"with ExitStack() as stack:\n"
"    files = [stack.enter_context(open(fname)) for fname in filenames]\n"
"    # Hold onto the close method, but don't call it yet.\n"
"    close_files = stack.pop_all().close\n"
"    # If opening any file fails, all previously opened files will be\n"
"    # closed automatically. If all files are opened successfully,\n"
"    # they will remain open even after the with statement ends.\n"
"    # close_files() can then be invoked explicitly to close them all."
msgstr ""
"with ExitStack() as stack:\n"
"    files = [stack.enter_context(open(fname)) for fname in filenames]\n"
"    # close   ,   .\n"
"    close_files = stack.pop_all().close\n"
"    #     ,    \n"
"    #  .    ,\n"
"    # with      .  \n"
"    # close_files()      ."

#: ../../library/contextlib.rst:617
msgid ""
"Immediately unwinds the callback stack, invoking callbacks in the reverse"
" order of registration. For any context managers and exit callbacks "
"registered, the arguments passed in will indicate that no exception "
"occurred."
msgstr ""
"   ,    .          "
"  ."

#: ../../library/contextlib.rst:624
msgid ""
"An :ref:`asynchronous context manager `, similar "
"to :class:`ExitStack`, that supports combining both synchronous and "
"asynchronous context managers, as well as having coroutines for cleanup "
"logic."
msgstr ""
":class:`ExitStack`\\  :ref:`   `, "
"           ."

#: ../../library/contextlib.rst:629
msgid ""
"The :meth:`~ExitStack.close` method is not implemented; :meth:`aclose` "
"must be used instead."
msgstr ":meth:`~ExitStack.close`   ;  :meth:`aclose`\\  ."

#: ../../library/contextlib.rst:635
msgid ""
"Similar to :meth:`ExitStack.enter_context` but expects an asynchronous "
"context manager."
msgstr ":meth:`ExitStack.enter_context`\\ ,    ."

#: ../../library/contextlib.rst:638
msgid ""
"Raises :exc:`TypeError` instead of :exc:`AttributeError` if *cm* is not "
"an asynchronous context manager."
msgstr ""

#: ../../library/contextlib.rst:644
msgid ""
"Similar to :meth:`ExitStack.push` but expects either an asynchronous "
"context manager or a coroutine function."
msgstr ":meth:`ExitStack.push`\\ ,      ."

#: ../../library/contextlib.rst:649
msgid "Similar to :meth:`ExitStack.callback` but expects a coroutine function."
msgstr ":meth:`ExitStack.callback`\\    ."

#: ../../library/contextlib.rst:654
msgid "Similar to :meth:`ExitStack.close` but properly handles awaitables."
msgstr ":meth:`ExitStack.close`\\    ."

#: ../../library/contextlib.rst:656
msgid "Continuing the example for :func:`asynccontextmanager`::"
msgstr ":func:`asynccontextmanager`    ::"

#: ../../library/contextlib.rst:658
msgid ""
"async with AsyncExitStack() as stack:\n"
"    connections = [await stack.enter_async_context(get_connection())\n"
"        for i in range(5)]\n"
"    # All opened connections will automatically be released at the end of"
"\n"
"    # the async with statement, even if attempts to open a connection\n"
"    # later in the list raise an exception."
msgstr ""
"async with AsyncExitStack() as stack:\n"
"    connections = [await stack.enter_async_context(get_connection())\n"
"        for i in range(5)]\n"
"    #      \n"
"    # , async with  \n"
"    #     ."

#: ../../library/contextlib.rst:668
msgid "Examples and Recipes"
msgstr " "

#: ../../library/contextlib.rst:670
msgid ""
"This section describes some examples and recipes for making effective use"
" of the tools provided by :mod:`contextlib`."
msgstr "  :mod:`contextlib`\\           ."

#: ../../library/contextlib.rst:675
msgid "Supporting a variable number of context managers"
msgstr "     "

#: ../../library/contextlib.rst:677
msgid ""
"The primary use case for :class:`ExitStack` is the one given in the class"
" documentation: supporting a variable number of context managers and "
"other cleanup operations in a single :keyword:`with` statement. The "
"variability may come from the number of context managers needed being "
"driven by user input (such as opening a user specified collection of "
"files), or from some of the context managers being optional::"
msgstr ""
":class:`ExitStack`\\       :      "
"    :keyword:`with`  .   (      "
")      ,        ::"

#: ../../library/contextlib.rst:684
msgid ""
"with ExitStack() as stack:\n"
"    for resource in resources:\n"
"        stack.enter_context(resource)\n"
"    if need_special_resource():\n"
"        special = acquire_special_resource()\n"
"        stack.callback(release_special_resource, special)\n"
"    # Perform operations that use the acquired resources"
msgstr ""
"with ExitStack() as stack:\n"
"    for resource in resources:\n"
"        stack.enter_context(resource)\n"
"    if need_special_resource():\n"
"        special = acquire_special_resource()\n"
"        stack.callback(release_special_resource, special)\n"
"    #     "

#: ../../library/contextlib.rst:692
msgid ""
"As shown, :class:`ExitStack` also makes it quite easy to use "
":keyword:`with` statements to manage arbitrary resources that don't "
"natively support the context management protocol."
msgstr ""
"  , :class:`ExitStack`\\  :keyword:`with`     "
"         ."

#: ../../library/contextlib.rst:698
msgid "Catching exceptions from ``__enter__`` methods"
msgstr "``__enter__``    "

#: ../../library/contextlib.rst:700
msgid ""
"It is occasionally desirable to catch exceptions from an ``__enter__`` "
"method implementation, *without* inadvertently catching exceptions from "
"the :keyword:`with` statement body or the context manager's ``__exit__`` "
"method. By using :class:`ExitStack` the steps in the context management "
"protocol can be separated slightly in order to allow this::"
msgstr ""
" :keyword:`with`     ``__exit__``      "
"**, ``__enter__``       . "
":class:`ExitStack`\\           ::"

#: ../../library/contextlib.rst:706
msgid ""
"stack = ExitStack()\n"
"try:\n"
"    x = stack.enter_context(cm)\n"
"except Exception:\n"
"    # handle __enter__ exception\n"
"else:\n"
"    with stack:\n"
"        # Handle normal case"
msgstr ""
"stack = ExitStack()\n"
"try:\n"
"    x = stack.enter_context(cm)\n"
"except Exception:\n"
"    # __enter__  \n"
"else:\n"
"    with stack:\n"
"        #   "

#: ../../library/contextlib.rst:715
msgid ""
"Actually needing to do this is likely to indicate that the underlying API"
" should be providing a direct resource management interface for use with "
":keyword:`try`/:keyword:`except`/:keyword:`finally` statements, but not "
"all APIs are well designed in that regard. When a context manager is the "
"only resource management API provided, then :class:`ExitStack` can make "
"it easier to handle various situations that can't be handled directly in "
"a :keyword:`with` statement."
msgstr ""
"       API "
":keyword:`try`/:keyword:`except`/:keyword:`finally`       "
"    ,  API      .    "
"   API , :class:`ExitStack`\\  :keyword:`with`    "
"        ."

#: ../../library/contextlib.rst:725
msgid "Cleaning up in an ``__enter__`` implementation"
msgstr "``__enter__``  "

#: ../../library/contextlib.rst:727
msgid ""
"As noted in the documentation of :meth:`ExitStack.push`, this method can "
"be useful in cleaning up an already allocated resource if later steps in "
"the :meth:`~object.__enter__` implementation fail."
msgstr ""
":meth:`ExitStack.push`  ,   :meth:`~object.__enter__`  "
"          ."

#: ../../library/contextlib.rst:731
msgid ""
"Here's an example of doing this for a context manager that accepts "
"resource acquisition and release functions, along with an optional "
"validation function, and maps them to the context management protocol::"
msgstr ""
"                 "
"    ::"

#: ../../library/contextlib.rst:735
#, python-brace-format
msgid ""
"from contextlib import contextmanager, AbstractContextManager, ExitStack\n"
"\n"
"class ResourceManager(AbstractContextManager):\n"
"\n"
"    def __init__(self, acquire_resource, release_resource, "
"check_resource_ok=None):\n"
"        self.acquire_resource = acquire_resource\n"
"        self.release_resource = release_resource\n"
"        if check_resource_ok is None:\n"
"            def check_resource_ok(resource):\n"
"                return True\n"
"        self.check_resource_ok = check_resource_ok\n"
"\n"
"    @contextmanager\n"
"    def _cleanup_on_error(self):\n"
"        with ExitStack() as stack:\n"
"            stack.push(self)\n"
"            yield\n"
"            # The validation check passed and didn't raise an exception\n"
"            # Accordingly, we want to keep the resource, and pass it\n"
"            # back to our caller\n"
"            stack.pop_all()\n"
"\n"
"    def __enter__(self):\n"
"        resource = self.acquire_resource()\n"
"        with self._cleanup_on_error():\n"
"            if not self.check_resource_ok(resource):\n"
"                msg = \"Failed validation for {!r}\"\n"
"                raise RuntimeError(msg.format(resource))\n"
"        return resource\n"
"\n"
"    def __exit__(self, *exc_details):\n"
"        # We don't need to duplicate any of our resource release logic\n"
"        self.release_resource()"
msgstr ""
"from contextlib import contextmanager, AbstractContextManager, ExitStack\n"
"\n"
"class ResourceManager(AbstractContextManager):\n"
"\n"
"    def __init__(self, acquire_resource, release_resource, "
"check_resource_ok=None):\n"
"        self.acquire_resource = acquire_resource\n"
"        self.release_resource = release_resource\n"
"        if check_resource_ok is None:\n"
"            def check_resource_ok(resource):\n"
"                return True\n"
"        self.check_resource_ok = check_resource_ok\n"
"\n"
"    @contextmanager\n"
"    def _cleanup_on_error(self):\n"
"        with ExitStack() as stack:\n"
"            stack.push(self)\n"
"            yield\n"
"            #      \n"
"            # ,    \n"
"            #  \n"
"            stack.pop_all()\n"
"\n"
"    def __enter__(self):\n"
"        resource = self.acquire_resource()\n"
"        with self._cleanup_on_error():\n"
"            if not self.check_resource_ok(resource):\n"
"                msg = \"Failed validation for {!r}\"\n"
"                raise RuntimeError(msg.format(resource))\n"
"        return resource\n"
"\n"
"    def __exit__(self, *exc_details):\n"
"        #      \n"
"        self.release_resource()"

#: ../../library/contextlib.rst:771
msgid "Replacing any use of ``try-finally`` and flag variables"
msgstr "``try-finally``\\    "

#: ../../library/contextlib.rst:773
msgid ""
"A pattern you will sometimes see is a ``try-finally`` statement with a "
"flag variable to indicate whether or not the body of the ``finally`` "
"clause should be executed. In its simplest form (that can't already be "
"handled just by using an ``except`` clause instead), it looks something "
"like this::"
msgstr ""
"   ``finally``        ``try-finally`` "
".   (  ``except``       )  ::"

#: ../../library/contextlib.rst:778
msgid ""
"cleanup_needed = True\n"
"try:\n"
"    result = perform_operation()\n"
"    if result:\n"
"        cleanup_needed = False\n"
"finally:\n"
"    if cleanup_needed:\n"
"        cleanup_resources()"
msgstr ""
"cleanup_needed = True\n"
"try:\n"
"    result = perform_operation()\n"
"    if result:\n"
"        cleanup_needed = False\n"
"finally:\n"
"    if cleanup_needed:\n"
"        cleanup_resources()"

#: ../../library/contextlib.rst:787
msgid ""
"As with any ``try`` statement based code, this can cause problems for "
"development and review, because the setup code and the cleanup code can "
"end up being separated by arbitrarily long sections of code."
msgstr ""
" ``try``    ,              "
"   ."

#: ../../library/contextlib.rst:791
msgid ""
":class:`ExitStack` makes it possible to instead register a callback for "
"execution at the end of a ``with`` statement, and then later decide to "
"skip executing that callback::"
msgstr ""
":class:`ExitStack`\\   ``with``          "
"    ::"

#: ../../library/contextlib.rst:795
msgid ""
"from contextlib import ExitStack\n"
"\n"
"with ExitStack() as stack:\n"
"    stack.callback(cleanup_resources)\n"
"    result = perform_operation()\n"
"    if result:\n"
"        stack.pop_all()"
msgstr ""
"from contextlib import ExitStack\n"
"\n"
"with ExitStack() as stack:\n"
"    stack.callback(cleanup_resources)\n"
"    result = perform_operation()\n"
"    if result:\n"
"        stack.pop_all()"

#: ../../library/contextlib.rst:803
msgid ""
"This allows the intended cleanup behaviour to be made explicit up front, "
"rather than requiring a separate flag variable."
msgstr "      ,        ."

#: ../../library/contextlib.rst:806
msgid ""
"If a particular application uses this pattern a lot, it can be simplified"
" even further by means of a small helper class::"
msgstr "      ,         ::"

#: ../../library/contextlib.rst:809
msgid ""
"from contextlib import ExitStack\n"
"\n"
"class Callback(ExitStack):\n"
"    def __init__(self, callback, /, *args, **kwds):\n"
"        super().__init__()\n"
"        self.callback(callback, *args, **kwds)\n"
"\n"
"    def cancel(self):\n"
"        self.pop_all()\n"
"\n"
"with Callback(cleanup_resources) as cb:\n"
"    result = perform_operation()\n"
"    if result:\n"
"        cb.cancel()"
msgstr ""
"from contextlib import ExitStack\n"
"\n"
"class Callback(ExitStack):\n"
"    def __init__(self, callback, /, *args, **kwds):\n"
"        super().__init__()\n"
"        self.callback(callback, *args, **kwds)\n"
"\n"
"    def cancel(self):\n"
"        self.pop_all()\n"
"\n"
"with Callback(cleanup_resources) as cb:\n"
"    result = perform_operation()\n"
"    if result:\n"
"        cb.cancel()"

#: ../../library/contextlib.rst:824
msgid ""
"If the resource cleanup isn't already neatly bundled into a standalone "
"function, then it is still possible to use the decorator form of "
":meth:`ExitStack.callback` to declare the resource cleanup in advance::"
msgstr ""
"         , :meth:`ExitStack.callback`\\  "
"       ::"

#: ../../library/contextlib.rst:829
msgid ""
"from contextlib import ExitStack\n"
"\n"
"with ExitStack() as stack:\n"
"    @stack.callback\n"
"    def cleanup_resources():\n"
"        ...\n"
"    result = perform_operation()\n"
"    if result:\n"
"        stack.pop_all()"
msgstr ""
"from contextlib import ExitStack\n"
"\n"
"with ExitStack() as stack:\n"
"    @stack.callback\n"
"    def cleanup_resources():\n"
"        ...\n"
"    result = perform_operation()\n"
"    if result:\n"
"        stack.pop_all()"

#: ../../library/contextlib.rst:839
msgid ""
"Due to the way the decorator protocol works, a callback function declared"
" this way cannot take any parameters. Instead, any resources to be "
"released must be accessed as closure variables."
msgstr ""
"    ,           .   "
"  (closure)   ."

#: ../../library/contextlib.rst:845
msgid "Using a context manager as a function decorator"
msgstr "    "

#: ../../library/contextlib.rst:847
msgid ""
":class:`ContextDecorator` makes it possible to use a context manager in "
"both an ordinary ``with`` statement and also as a function decorator."
msgstr ""
":class:`ContextDecorator`\\   ``with``      "
"   ."

#: ../../library/contextlib.rst:850
msgid ""
"For example, it is sometimes useful to wrap functions or groups of "
"statements with a logger that can track the time of entry and time of "
"exit.  Rather than writing both a function decorator and a context "
"manager for the task, inheriting from :class:`ContextDecorator` provides "
"both capabilities in a single definition::"
msgstr ""
" ,        (logger)        . "
"        , :class:`ContextDecorator`\\  "
"     ::"

#: ../../library/contextlib.rst:856
#, python-format
msgid ""
"from contextlib import ContextDecorator\n"
"import logging\n"
"\n"
"logging.basicConfig(level=logging.INFO)\n"
"\n"
"class track_entry_and_exit(ContextDecorator):\n"
"    def __init__(self, name):\n"
"        self.name = name\n"
"\n"
"    def __enter__(self):\n"
"        logging.info('Entering: %s', self.name)\n"
"\n"
"    def __exit__(self, exc_type, exc, exc_tb):\n"
"        logging.info('Exiting: %s', self.name)"
msgstr ""
"from contextlib import ContextDecorator\n"
"import logging\n"
"\n"
"logging.basicConfig(level=logging.INFO)\n"
"\n"
"class track_entry_and_exit(ContextDecorator):\n"
"    def __init__(self, name):\n"
"        self.name = name\n"
"\n"
"    def __enter__(self):\n"
"        logging.info('Entering: %s', self.name)\n"
"\n"
"    def __exit__(self, exc_type, exc, exc_tb):\n"
"        logging.info('Exiting: %s', self.name)"

#: ../../library/contextlib.rst:871
msgid "Instances of this class can be used as both a context manager::"
msgstr "       ::"

#: ../../library/contextlib.rst:873
msgid ""
"with track_entry_and_exit('widget loader'):\n"
"    print('Some time consuming activity goes here')\n"
"    load_widget()"
msgstr ""
"with track_entry_and_exit('widget loader'):\n"
"    print('Some time consuming activity goes here')\n"
"    load_widget()"

#: ../../library/contextlib.rst:877
msgid "And also as a function decorator::"
msgstr "     ::"

#: ../../library/contextlib.rst:879
msgid ""
"@track_entry_and_exit('widget loader')\n"
"def activity():\n"
"    print('Some time consuming activity goes here')\n"
"    load_widget()"
msgstr ""
"@track_entry_and_exit('widget loader')\n"
"def activity():\n"
"    print('Some time consuming activity goes here')\n"
"    load_widget()"

#: ../../library/contextlib.rst:884
msgid ""
"Note that there is one additional limitation when using context managers "
"as function decorators: there's no way to access the return value of "
":meth:`~object.__enter__`. If that value is needed, then it is still "
"necessary to use an explicit ``with`` statement."
msgstr ""
"            : "
":meth:`~object.__enter__`\\        .   ,  "
" ``with``    ."

#: ../../library/contextlib.rst:891
msgid ":pep:`343` - The \"with\" statement"
msgstr ":pep:`343`- \"with\" "

#: ../../library/contextlib.rst:892
msgid ""
"The specification, background, and examples for the Python "
":keyword:`with` statement."
msgstr " :keyword:`with`  ,   "

#: ../../library/contextlib.rst:898
msgid "Single use, reusable and reentrant context managers"
msgstr ",       "

#: ../../library/contextlib.rst:900
msgid ""
"Most context managers are written in a way that means they can only be "
"used effectively in a :keyword:`with` statement once. These single use "
"context managers must be created afresh each time they're used - "
"attempting to use them a second time will trigger an exception or "
"otherwise not work correctly."
msgstr ""
"   :keyword:`with`           "
".          -       "
"  ."

#: ../../library/contextlib.rst:906
msgid ""
"This common limitation means that it is generally advisable to create "
"context managers directly in the header of the :keyword:`with` statement "
"where they are used (as shown in all of the usage examples above)."
msgstr ""
"        :keyword:`with`      "
"   (    )."

#: ../../library/contextlib.rst:910
msgid ""
"Files are an example of effectively single use context managers, since "
"the first :keyword:`with` statement will close the file, preventing any "
"further IO operations using that file object."
msgstr ""
"     ,   :keyword:`with`   ,    "
"  IO   ."

#: ../../library/contextlib.rst:914
msgid ""
"Context managers created using :func:`contextmanager` are also single use"
" context managers, and will complain about the underlying generator "
"failing to yield if an attempt is made to use them a second time::"
msgstr ""
":func:`contextmanager`\\       ,   "
"        ::"

#: ../../library/contextlib.rst:918
msgid ""
">>> from contextlib import contextmanager\n"
">>> @contextmanager\n"
"... def singleuse():\n"
"...     print(\"Before\")\n"
"...     yield\n"
"...     print(\"After\")\n"
"...\n"
">>> cm = singleuse()\n"
">>> with cm:\n"
"...     pass\n"
"...\n"
"Before\n"
"After\n"
">>> with cm:\n"
"...     pass\n"
"...\n"
"Traceback (most recent call last):\n"
"    ...\n"
"RuntimeError: generator didn't yield"
msgstr ""
">>> from contextlib import contextmanager\n"
">>> @contextmanager\n"
"... def singleuse():\n"
"...     print(\"Before\")\n"
"...     yield\n"
"...     print(\"After\")\n"
"...\n"
">>> cm = singleuse()\n"
">>> with cm:\n"
"...     pass\n"
"...\n"
"Before\n"
"After\n"
">>> with cm:\n"
"...     pass\n"
"...\n"
"Traceback (most recent call last):\n"
"    ...\n"
"RuntimeError: generator didn't yield"

#: ../../library/contextlib.rst:942
msgid "Reentrant context managers"
msgstr "   "

#: ../../library/contextlib.rst:944
msgid ""
"More sophisticated context managers may be \"reentrant\". These context "
"managers can not only be used in multiple :keyword:`with` statements, but"
" may also be used *inside* a :keyword:`!with` statement that is already "
"using the same context manager."
msgstr ""
"    \"\"  .     :keyword:`with`  "
"          :keyword:`!with`  **   "
"."

#: ../../library/contextlib.rst:949
msgid ""
":class:`threading.RLock` is an example of a reentrant context manager, as"
" are :func:`suppress`, :func:`redirect_stdout`, and :func:`chdir`. Here's"
" a very simple example of reentrant use::"
msgstr ""
":class:`threading.RLock`\\ :func:`suppress`, :func:`redirect_stdout`  "
":func:`chdir`\\      .       ::"

#: ../../library/contextlib.rst:953
msgid ""
">>> from contextlib import redirect_stdout\n"
">>> from io import StringIO\n"
">>> stream = StringIO()\n"
">>> write_to_stream = redirect_stdout(stream)\n"
">>> with write_to_stream:\n"
"...     print(\"This is written to the stream rather than stdout\")\n"
"...     with write_to_stream:\n"
"...         print(\"This is also written to the stream\")\n"
"...\n"
">>> print(\"This is written directly to stdout\")\n"
"This is written directly to stdout\n"
">>> print(stream.getvalue())\n"
"This is written to the stream rather than stdout\n"
"This is also written to the stream"
msgstr ""
">>> from contextlib import redirect_stdout\n"
">>> from io import StringIO\n"
">>> stream = StringIO()\n"
">>> write_to_stream = redirect_stdout(stream)\n"
">>> with write_to_stream:\n"
"...     print(\"This is written to the stream rather than stdout\")\n"
"...     with write_to_stream:\n"
"...         print(\"This is also written to the stream\")\n"
"...\n"
">>> print(\"This is written directly to stdout\")\n"
"This is written directly to stdout\n"
">>> print(stream.getvalue())\n"
"This is written to the stream rather than stdout\n"
"This is also written to the stream"

#: ../../library/contextlib.rst:968
msgid ""
"Real world examples of reentrancy are more likely to involve multiple "
"functions calling each other and hence be far more complicated than this "
"example."
msgstr "              ."

#: ../../library/contextlib.rst:972
msgid ""
"Note also that being reentrant is *not* the same thing as being thread "
"safe. :func:`redirect_stdout`, for example, is definitely not thread "
"safe, as it makes a global modification to the system state by binding "
":data:`sys.stdout` to a different stream."
msgstr ""
"       **\\ .  , "
":func:`redirect_stdout`\\ :data:`sys.stdout`\\      "
"     ."

#: ../../library/contextlib.rst:981
msgid "Reusable context managers"
msgstr "   "

#: ../../library/contextlib.rst:983
msgid ""
"Distinct from both single use and reentrant context managers are "
"\"reusable\" context managers (or, to be completely explicit, \"reusable,"
" but not reentrant\" context managers, since reentrant context managers "
"are also reusable). These context managers support being used multiple "
"times, but will fail (or otherwise not work correctly) if the specific "
"context manager instance has already been used in a containing with "
"statement."
msgstr ""
"      \"  \"   (    "
"  ,   \"     \"  ).   "
"     ,      with     "
"(   )."

#: ../../library/contextlib.rst:990
msgid ""
":class:`threading.Lock` is an example of a reusable, but not reentrant, "
"context manager (for a reentrant lock, it is necessary to use "
":class:`threading.RLock` instead)."
msgstr ""
":class:`threading.Lock`\\          (  "
"  :class:`threading.RLock`\\   )."

#: ../../library/contextlib.rst:994
msgid ""
"Another example of a reusable, but not reentrant, context manager is "
":class:`ExitStack`, as it invokes *all* currently registered callbacks "
"when leaving any with statement, regardless of where those callbacks were"
" added::"
msgstr ""
"           :class:`ExitStack`\\ ,   "
"  with       **  ::"

#: ../../library/contextlib.rst:999
msgid ""
">>> from contextlib import ExitStack\n"
">>> stack = ExitStack()\n"
">>> with stack:\n"
"...     stack.callback(print, \"Callback: from first context\")\n"
"...     print(\"Leaving first context\")\n"
"...\n"
"Leaving first context\n"
"Callback: from first context\n"
">>> with stack:\n"
"...     stack.callback(print, \"Callback: from second context\")\n"
"...     print(\"Leaving second context\")\n"
"...\n"
"Leaving second context\n"
"Callback: from second context\n"
">>> with stack:\n"
"...     stack.callback(print, \"Callback: from outer context\")\n"
"...     with stack:\n"
"...         stack.callback(print, \"Callback: from inner context\")\n"
"...         print(\"Leaving inner context\")\n"
"...     print(\"Leaving outer context\")\n"
"...\n"
"Leaving inner context\n"
"Callback: from inner context\n"
"Callback: from outer context\n"
"Leaving outer context"
msgstr ""
">>> from contextlib import ExitStack\n"
">>> stack = ExitStack()\n"
">>> with stack:\n"
"...     stack.callback(print, \"Callback: from first context\")\n"
"...     print(\"Leaving first context\")\n"
"...\n"
"Leaving first context\n"
"Callback: from first context\n"
">>> with stack:\n"
"...     stack.callback(print, \"Callback: from second context\")\n"
"...     print(\"Leaving second context\")\n"
"...\n"
"Leaving second context\n"
"Callback: from second context\n"
">>> with stack:\n"
"...     stack.callback(print, \"Callback: from outer context\")\n"
"...     with stack:\n"
"...         stack.callback(print, \"Callback: from inner context\")\n"
"...         print(\"Leaving inner context\")\n"
"...     print(\"Leaving outer context\")\n"
"...\n"
"Leaving inner context\n"
"Callback: from inner context\n"
"Callback: from outer context\n"
"Leaving outer context"

#: ../../library/contextlib.rst:1025
msgid ""
"As the output from the example shows, reusing a single stack object "
"across multiple with statements works correctly, but attempting to nest "
"them will cause the stack to be cleared at the end of the innermost with "
"statement, which is unlikely to be desirable behaviour."
msgstr ""
"  ,  with        ,     "
"with        ."

#: ../../library/contextlib.rst:1030
msgid ""
"Using separate :class:`ExitStack` instances instead of reusing a single "
"instance avoids that problem::"
msgstr "     :class:`ExitStack`       ::"

#: ../../library/contextlib.rst:1033
msgid ""
">>> from contextlib import ExitStack\n"
">>> with ExitStack() as outer_stack:\n"
"...     outer_stack.callback(print, \"Callback: from outer context\")\n"
"...     with ExitStack() as inner_stack:\n"
"...         inner_stack.callback(print, \"Callback: from inner context\")"
"\n"
"...         print(\"Leaving inner context\")\n"
"...     print(\"Leaving outer context\")\n"
"...\n"
"Leaving inner context\n"
"Callback: from inner context\n"
"Leaving outer context\n"
"Callback: from outer context"
msgstr ""
">>> from contextlib import ExitStack\n"
">>> with ExitStack() as outer_stack:\n"
"...     outer_stack.callback(print, \"Callback: from outer context\")\n"
"...     with ExitStack() as inner_stack:\n"
"...         inner_stack.callback(print, \"Callback: from inner context\")"
"\n"
"...         print(\"Leaving inner context\")\n"
"...     print(\"Leaving outer context\")\n"
"...\n"
"Leaving inner context\n"
"Callback: from inner context\n"
"Leaving outer context\n"
"Callback: from outer context"


Web Proxy Viewer  |  New URL  |  Original Page