From: Daniele Varrazzo Date: Sun, 20 Dec 2020 18:23:20 +0000 (+0100) Subject: Better use of Cython public properties X-Git-Tag: 3.0.dev0~254 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f045d822ca3c375b62657b55a6dd88daae4548a5;p=thirdparty%2Fpsycopg.git Better use of Cython public properties --- diff --git a/psycopg3_c/psycopg3_c/adapt.pyx b/psycopg3_c/psycopg3_c/adapt.pyx index c8e3c5cb1..3de5919cb 100644 --- a/psycopg3_c/psycopg3_c/adapt.pyx +++ b/psycopg3_c/psycopg3_c/adapt.pyx @@ -32,31 +32,20 @@ logger = logging.getLogger("psycopg3.adapt") cdef class CDumper: - cdef object _src - cdef object _context - cdef object _connection + cdef object src + cdef public object context + cdef public object connection + cdef public impl.Oid oid cdef PGconn _pgconn - cdef impl.Oid _oid def __init__(self, src: type, context: AdaptContext = None): - self._src = src - self._context = context - self._connection = _connection_from_context(context) + self.src = src + self.context = context + self.connection = _connection_from_context(context) self._pgconn = ( - self._connection.pgconn if self._connection is not None else None + self.connection.pgconn if self.connection is not None else None ) - - @property - def src(self) -> type: - return self._src - - @property - def context(self) -> AdaptContext: - return self._context - - @property - def connection(self): - return self._connection + # oid is implicitly set to 0, subclasses may override it def dump(self, obj: Any) -> bytes: raise NotImplementedError() @@ -94,12 +83,6 @@ cdef class CDumper: return rv - @property - def oid(self) -> int: - # Implicitly initialised to zero - # Subclasses may implement __cinit__ to set a per-class value - return self._oid - @classmethod def register( cls, @@ -118,26 +101,14 @@ cdef class CDumper: cdef class CLoader: - cdef impl.Oid _oid - cdef object _context - cdef object _connection + cdef public impl.Oid oid + cdef public object context + cdef public object connection def __init__(self, oid: int, context: "AdaptContext" = None): - self._oid = oid - self._context = context - self._connection = _connection_from_context(context) - - @property - def oid(self) -> int: - return self._oid - - @property - def context(self) -> AdaptContext: - return self._context - - @property - def connection(self): - return self._connection + self.oid = oid + self.context = context + self.connection = _connection_from_context(context) cdef object cload(self, const char *data, size_t length): raise NotImplementedError() diff --git a/psycopg3_c/psycopg3_c/transform.pyx b/psycopg3_c/psycopg3_c/transform.pyx index 6952cf76a..dc307caa8 100644 --- a/psycopg3_c/psycopg3_c/transform.pyx +++ b/psycopg3_c/psycopg3_c/transform.pyx @@ -34,12 +34,13 @@ cdef class Transformer: state so adapting several values of the same type can use optimisations. """ + cdef readonly dict dumpers, loaders + cdef readonly object connection + cdef readonly str encoding cdef list _dumpers_maps, _loaders_maps - cdef dict _dumpers, _loaders, _dumpers_cache, _loaders_cache, _load_funcs - cdef object _connection + cdef dict _dumpers_cache, _loaders_cache, _load_funcs cdef PGresult _pgresult cdef int _nfields, _ntuples - cdef str _encoding cdef list _row_loaders @@ -67,65 +68,49 @@ cdef class Transformer: cdef Transformer ctx if context is None: - self._connection = None - self._encoding = "utf-8" - self._dumpers = {} - self._loaders = {} - self._dumpers_maps = [self._dumpers] - self._loaders_maps = [self._loaders] + self.connection = None + self.encoding = "utf-8" + self.dumpers = {} + self.loaders = {} + self._dumpers_maps = [self.dumpers] + self._loaders_maps = [self.loaders] elif isinstance(context, Transformer): # A transformer created from a transformers: usually it happens # for nested types: share the entire state of the parent ctx = context - self._connection = ctx._connection - self._encoding = ctx.encoding - self._dumpers = ctx._dumpers - self._loaders = ctx._loaders + self.connection = ctx.connection + self.encoding = ctx.encoding + self.dumpers = ctx.dumpers + self.loaders = ctx.loaders self._dumpers_maps.extend(ctx._dumpers_maps) self._loaders_maps.extend(ctx._loaders_maps) # the global maps are already in the lists return elif isinstance(context, BaseCursor): - self._connection = context.connection - self._encoding = context.connection.client_encoding - self._dumpers = {} + self.connection = context.connection + self.encoding = context.connection.client_encoding + self.dumpers = {} self._dumpers_maps.extend( - (self._dumpers, context.dumpers, self.connection.dumpers) + (self.dumpers, context.dumpers, self.connection.dumpers) ) - self._loaders = {} + self.loaders = {} self._loaders_maps.extend( - (self._loaders, context.loaders, self.connection.loaders) + (self.loaders, context.loaders, self.connection.loaders) ) elif isinstance(context, BaseConnection): - self._connection = context - self._encoding = context.client_encoding - self._dumpers = {} - self._dumpers_maps.extend((self._dumpers, context.dumpers)) - self._loaders = {} - self._loaders_maps.extend((self._loaders, context.loaders)) + self.connection = context + self.encoding = context.client_encoding + self.dumpers = {} + self._dumpers_maps.extend((self.dumpers, context.dumpers)) + self.loaders = {} + self._loaders_maps.extend((self.loaders, context.loaders)) self._dumpers_maps.append(Dumper.globals) self._loaders_maps.append(Loader.globals) - @property - def connection(self): - return self._connection - - @property - def encoding(self): - return self._encoding - - @property - def dumpers(self): - return self._dumpers - - @property - def loaders(self): - return self._loaders - @property def pgresult(self) -> Optional[PGresult]: return self._pgresult diff --git a/psycopg3_c/psycopg3_c/types/numeric.pyx b/psycopg3_c/psycopg3_c/types/numeric.pyx index aec21dcad..80947bc4c 100644 --- a/psycopg3_c/psycopg3_c/types/numeric.pyx +++ b/psycopg3_c/psycopg3_c/types/numeric.pyx @@ -23,7 +23,7 @@ cdef extern from "Python.h": cdef class IntDumper(CDumper): def __cinit__(self): - self._oid = oids.INT8_OID + self.oid = oids.INT8_OID def __init__(self, src: type, context: AdaptContext = None): super().__init__(src, context) diff --git a/psycopg3_c/psycopg3_c/types/singletons.pyx b/psycopg3_c/psycopg3_c/types/singletons.pyx index 8b46f338d..c77463d85 100644 --- a/psycopg3_c/psycopg3_c/types/singletons.pyx +++ b/psycopg3_c/psycopg3_c/types/singletons.pyx @@ -10,7 +10,7 @@ from psycopg3_c cimport oids cdef class BoolDumper(CDumper): def __cinit__(self): - self._oid = oids.BOOL_OID + self.oid = oids.BOOL_OID def dump(self, obj) -> bytes: # Fast paths, just a pointer comparison diff --git a/psycopg3_c/psycopg3_c/types/text.pyx b/psycopg3_c/psycopg3_c/types/text.pyx index da80a440d..488cd9958 100644 --- a/psycopg3_c/psycopg3_c/types/text.pyx +++ b/psycopg3_c/psycopg3_c/types/text.pyx @@ -23,8 +23,8 @@ cdef class _StringDumper(CDumper): self.is_utf8 = 0 self.encoding = "utf-8" - conn = self._connection - if conn: + conn = self.connection + if conn is not None: self._bytes_encoding = conn.client_encoding.encode("utf-8") self.encoding = PyBytes_AsString(self._bytes_encoding) if ( @@ -77,8 +77,8 @@ cdef class TextLoader(CLoader): self.is_utf8 = 0 self.encoding = "utf-8" - conn = self._connection - if conn: + conn = self.connection + if conn is not None: self._bytes_encoding = conn.client_encoding.encode("utf-8") self.encoding = PyBytes_AsString(self._bytes_encoding) if self._bytes_encoding == b"utf-8": @@ -99,7 +99,7 @@ cdef class BytesDumper(CDumper): cdef Escaping esc def __cinit__(self): - self._oid = oids.BYTEA_OID + self.oid = oids.BYTEA_OID def __init__(self, src: type, context: AdaptContext): super().__init__(src, context)