On Jan 16, 2017, at 1:27 PM, Terry Reedy <tjre...@udel.edu> wrote:
> 
> On 1/16/2017 1:06 PM, Israel Brewster wrote:
>> I generally use context managers for my SQL database connections, so I can 
>> just write code like:
>> 
>> with psql_cursor() as cursor:
>>    <do whatever>
>> 
>> And the context manager takes care of making a connection (or getting a 
>> connection from a pool, more likely), and cleaning up after the fact (such 
>> as putting the connection back in the pool), even if something goes wrong. 
>> Simple, elegant, and works well.
>> 
>> The problem is that, from time to time, I can't get a connection, the result 
>> being that cursor is None,
> 
> This would be like open('bad file') returning None instead of raising 
> FileNotFoundError.
> 
>> and attempting to use it results in an AttributeError.
> 
> Just as None.read would.
> 
> Actually, I have to wonder about your claim.  The with statement would look 
> for cursor.__enter__ and then cursor.__exit__, and None does not have those 
> methods.  In other words, the expression following 'with' must evaluate to a 
> context manager and None is not a context manager.
> 
> >>> with None: pass
> 
> Traceback (most recent call last):
>  File "<pyshell#3>", line 1, in <module>
>    with None: pass
> AttributeError: __enter__
> 
> Is psql_cursor() returning a fake None object with __enter__ and __exit__ 
> methods?

No, the *context manager*, which I call in the with *does* have __enter__ and 
__exit__ methods. It's just that the __enter__ method returns None when it 
can't get a connection. So the expression following with *does* evaluate to a 
context manager, but the expression following as evaluates to None.

-----------------------------------------------
Israel Brewster
Systems Analyst II
Ravn Alaska
5245 Airport Industrial Rd
Fairbanks, AK 99709
(907) 450-7293
-----------------------------------------------

> 
> -- 
> Terry Jan Reedy
> 
> -- 
> https://mail.python.org/mailman/listinfo/python-list

-- 
https://mail.python.org/mailman/listinfo/python-list

Reply via email to