On 10/17/2013 7:35 PM, Nick Coghlan wrote:

On 18 Oct 2013 06:59, "Xavier Morel" <catch-...@masklinn.net
<mailto:catch-...@masklinn.net>> wrote:
 >
 > On 2013-10-17, at 22:11 , Ethan Furman wrote:
 >
 > > On 10/17/2013 01:03 PM, Terry Reedy wrote:
 > >>
 > >> class suppress:
 > >>   def __init__(self, *exceptions):
 > >>     self.exceptions = exceptions
 > >>   def __exit__(self, etype, eval, etrace):
 > >>     return etype in self.exceptions
 > >
 > > This fails when etype is a subclass of the exceptions, as mentioned
in the original issue.

There are two other failures; see below. I know better than to post code without testing or saying 'untested'; I just wish I would always remember...

 > That's fixed by using `issubclass` and does not infirm Terry's point
does it?

Yeah, it looks like it's worth switching to the class based
implementation in this case. I guess I'm too accustomed to that being
the more complex alternative, as I hadn't even tried it :)

With two more changes (add __enter__, account for etype is None), the suppress tests pass.

import unittest

class suppress:
    def __init__(self, *exceptions):
        self.exceptions = exceptions
    def __enter__(self): pass
    def __exit__(self, etype, val, tb):
        return etype is None or issubclass(etype, self.exceptions)

class Testsuppress(unittest.TestCase):

    def test_no_exception(self):
        with suppress(ValueError):
            self.assertEqual(pow(2, 5), 32)

    def test_exact_exception(self):
        with suppress(TypeError):
            len(5)

    def test_multiple_exception_args(self):
        with suppress(ZeroDivisionError, TypeError):
            len(5)

    def test_exception_hierarchy(self):
        with suppress(LookupError):
            'Hello'[50]

unittest.main()

>>> Ran 4 tests...OK

--
Terry Jan Reedy

_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
https://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
https://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to