Nick Coghlan added the comment:

Thanks for being understanding of the decision. Regarding my comment above 
about __subclasscheck__ potentially letting you implement this without changing 
the signature of suppress, here's an example of how you might be able to do 
that.

First, define a metaclass that delegates type checks to the type itself 
(similar to abc.ABCMeta):

class FilteredExceptionMeta(type):
    def __subclasscheck__(cls, other):
        return cls.__subclasshook__(other)
    def __instancecheck__(cls, other):
        return cls.__subclasshook__(type(other))

Then, define a factory function to create custom classes based on that 
metaclass:

def filtered_exc(exc_type, *, unless=()):
    class _FilteredException(metaclass=FilteredExceptionMeta):
        @classmethod
        def __subclasshook__(cls, other):
            return (issubclass(other, exc_type)
                    and not issubclass(other, unless))
    return _FilteredException


>>> from contextlib import suppress
>>> selective_filter = suppress(filtered_exc(OSError, unless=FileNotFoundError))
>>> with selective_filter:
...     raise OSError("Suppressed")
... 
>>> with selective_filter:
...     raise FileNotFoundError("Not suppressed")
... 
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
FileNotFoundError: Not suppressed

This works because suppress() calls issubclass() explicitly, unlike the current 
implementation of except clause processing.

----------

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue27814>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to