bpo-30266: support "= None" pattern in AbstractContextManager (#1448)
contextlib.AbstractContextManager now supports anti-registration
by setting __enter__ = None or __exit__ = None, following the pattern
introduced in bpo-25958.
diff --git a/Lib/contextlib.py b/Lib/contextlib.py
index c53b35e..962ceda 100644
--- a/Lib/contextlib.py
+++ b/Lib/contextlib.py
@@ -1,6 +1,7 @@
"""Utilities for with-statement contexts. See PEP 343."""
import abc
import sys
+import _collections_abc
from collections import deque
from functools import wraps
@@ -25,9 +26,7 @@
@classmethod
def __subclasshook__(cls, C):
if cls is AbstractContextManager:
- if (any("__enter__" in B.__dict__ for B in C.__mro__) and
- any("__exit__" in B.__dict__ for B in C.__mro__)):
- return True
+ return _collections_abc._check_methods(C, "__enter__", "__exit__")
return NotImplemented