bug? context managers vs ImportErrors

Steven D'Aprano steve at REMOVE-THIS-cybersource.com.au
Thu Aug 19 13:38:50 EDT 2010


On Thu, 19 Aug 2010 16:58:30 +0100, Chris Withers wrote:

> Hi All,
> 
> Am I right in thinking this is a bug:
> 
> class MyContextManager:
> 
>      def __enter__(self):
>          pass
> 
>      def __exit__(self,t,e,tb):
>          print type(t),t
>          print type(e),e
> 
> 
> with MyContextManager():
>     import foo.bar.baz
> 
> ...when executed, gives me:
> 
> <type 'type'> <type 'exceptions.ImportError'>
> <type 'str'> No module named foo.bar.baz
> 
> Why is 'e' ending up as a string rather than the ImportError object?

Because e is the exception value, not an exception instance. In other 
words, if you call t(e) you will get the instance you're expecting.

See the docs:

http://docs.python.org/library/stdtypes.html#contextmanager.__exit__

The three arguments exc_type, exc_value, exc_tb are the same three 
arguments you can pass to the raise statement:

http://docs.python.org/reference/simple_stmts.html#the-raise-statement

(BTW, I'm not suggesting you should do that from inside the __exit__ 
method.)

So, no, this is not a bug.



-- 
Steven



More information about the Python-list mailing list