Chris Kaynor, 31.10.2011 19:34:
I am currently rewritting a class using the Python C API to improve
performance of it, however I have not been able to find any
documentation about how to make a context manager using the C API.
You should take a look at Cython. It makes these things *so* much easier.
The code I am working to produce is the following (its a method of a class):
@contextlib.contextmanager
def connected(self, *args, **kwargs):
connection = self.connect(*args, **kwargs)
try:
yield
finally:
connection.disconnect()
You can use the above in Cython code unmodified, and it's likely going to
be good enough (depending on what kind of connection we are talking about
here).
In case that's also performance critical, however, it's likely faster to
spell it out as a class, i.e.
...
def connected(self, *args, **kwargs):
return ConnectionManager(self, args, kwargs)
cdef class ConnectionManager:
cdef object args, kwargs, connection, connect
def __init__(self, connector, args, kwargs):
self.args, self.kwargs = args, kwargs
self.connect = connector.connect
def __enter__(self):
self.connection = self.connect(*self.args, **self.kwargs)
def __exit__(self, *exc):
self.connection.disconnect()
return True # or False? I always forget which means what
Not that much longer either.
Stefan
--
http://mail.python.org/mailman/listinfo/python-list