Thanks for looking into this! My preference would be to use the @property syntax, as this will be immediately understandable to any Cython user and could contain arbitrary code, rather than just a macro call.
There are, however, a couple of downsides. The first is that it may not be clear when accessing an attribute that a full function call may be invoked. (Arguably this is the same issue one has with Python, but there attribute access is already expensive. The function could be inline as well if desired.) The second is that this means that this attribute is no longer an lvalue. The last is that it's a bit special to be defining methods on an extern class. Maybe it would have to be inline if it's in the pxd? If we're going to be defining a special syntax, I might prefer something like cdef extern class ...: int ndims "PyArray_NDIMS(*)" which more resembles int ndims "nd" Open to bikeshedding on what the "self" placeholder should be. As before, should the ndims lose its lvalue status in this case, or not (in case the accessor is really a macro intended to be used like this)? On Thu, Sep 27, 2018 at 10:38 AM Matti Picus <matti.pi...@gmail.com> wrote: > To solve issue #2498, I did some experiments > https://github.com/cython/cython/issues/2498#issuecomment-414543549 with > hiding direct field access in an external extension type (documented > here > > https://cython.readthedocs.io/en/latest/src/userguide/extension_types.html#external-extension-types). > > The idea is to write `a.ndims` in cython (in plain python code), and in > C magically get the attribute lookup converted into a `PyArray_NDIMS(a)` > getter, which could be a macro or a c-function. > > The experiments proved fruitful, and garnered some positive feedback so > I am pushing forward. > > I would like to get some feedback on syntax before I progress too far. > Should the syntax be extended to support > > |ctypedef class numpy.ndarray [object PyArrayObject]: cdef: # Convert > python __getattr__ access to c functions. int ndims PyArray_NDIMS | > > > or perhaps a decorator, like Python > > |ctypedef class numpy.ndarray [object PyArrayObject]: cdef: # Convert > python __getattr__ access to c functions. @property cdef int > ndims(self): return PyArray_NDIMS(self) or something else? The second > seems more wordy but more explicit. I don't know which would be easier > to implement or require more effort to test and maintain. Matti | > > _______________________________________________ > cython-devel mailing list > cython-devel@python.org > https://mail.python.org/mailman/listinfo/cython-devel >
_______________________________________________ cython-devel mailing list cython-devel@python.org https://mail.python.org/mailman/listinfo/cython-devel