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?

--
Terry Jan Reedy

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

Reply via email to