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