]> git.ipfire.org Git - thirdparty/psycopg.git/commitdiff
Better use of Cython public properties
authorDaniele Varrazzo <daniele.varrazzo@gmail.com>
Sun, 20 Dec 2020 18:23:20 +0000 (19:23 +0100)
committerDaniele Varrazzo <daniele.varrazzo@gmail.com>
Mon, 21 Dec 2020 15:53:14 +0000 (16:53 +0100)
psycopg3_c/psycopg3_c/adapt.pyx
psycopg3_c/psycopg3_c/transform.pyx
psycopg3_c/psycopg3_c/types/numeric.pyx
psycopg3_c/psycopg3_c/types/singletons.pyx
psycopg3_c/psycopg3_c/types/text.pyx

index c8e3c5cb164fd8c45eac252dc0724e32c3b1c7fa..3de5919cb2991d8435a7c8051776a1feaf8e7284 100644 (file)
@@ -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()
index 6952cf76abf04d60463acc1d30950046d67814c5..dc307caa88be5aad43f47cd0636a9f7c6e46e1c6 100644 (file)
@@ -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
index aec21dcad66b5fef34d1141638677c4b2a91820f..80947bc4ce3b09dfb62fc3e7f3368c7c33e11050 100644 (file)
@@ -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)
index 8b46f338df95d3e7177e01f88871e9669c8eb2fe..c77463d85291b70a844916d26eaa6dbe5eed5a45 100644 (file)
@@ -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
index da80a440d601f74a1d2feecb2fa89d6c1e0347e3..488cd995848603b0a8ab9a08292883773254b7cb 100644 (file)
@@ -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)