速報:Pythonの3.7は、このような理由(commit)のために特別にnullcontext
を提供します。私は利用可能な場合は、ドキュメントへのリンクを更新します。
3.7より前のPythonバージョン:標準ライブラリでは、これらのユースケース用に特別に設計されたコンテキストマネージャは提供されていません。
しかし、それはas
句が存在しない場合(バージョン3.4以降で利用可能)contextlib.suppress
、すなわち、最初のケースでは、その目的のために使用できることが判明:
ctx_mgr = <meaningfulContextManager> if <condition> else contextlib.suppress()
with ctx_mgr:
...
のPython 3.3、同様の作業ためまた、よりも遅いですが、contextlib.ExitStack
(テストでは2倍の時間がかかります)も利用できます。
as
句が必要な場合や、3.3より古いPythonバージョンを使用している場合は、開発者が独自にロールバックする必要があります。ここ は、一つの可能な実装は(下のメモを参照しますが、すべてのエラーは私のもの)である。もちろん、
ctx_mgr = <meaningfulContextManager> if <condition> else NullContextManager(dummy_resource)
with ctx_mgr as resource:
<operations on resource>
dummy_resource
が必要なすべての操作をサポートする必要があります。
class NullContextManager(object):
def __init__(self, dummy_resource=None):
self.dummy_resource = dummy_resource
def __enter__(self):
return self.dummy_resource
def __exit__(self, *args):
pass
一つは、その後、書くことができます「意味のある」資源のたとえば、意味のあるコンテキストマネージャー__enter__()
が、管理されたブロック内でquack()
に行われた何かを返す場合は、dummy_resource
も、まったく何もしなくてもそれをサポートする必要があります。
class DummyDuck(object):
def quack()
# Ssssh...
pass
ctx_mgr = <meaningfulContextManager> if <condition> else NullContextManager(DummyDuck())
with ctx_mgr as someDuck:
someDuck.quack()
ソース:A Python feature request。その議論に貢献したすべての人に感謝します。これは、自分の答えた質問でその結果を要約し、長いスレッドを読む時間を節約するための私の試みです。また、Pythonドキュメントのthis use of ExitStack
の記述を参照してください。
「あれと何か:」の代わりに 'もし1:'はどうですか? – Alfe