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

Reply via email to