如何将属性文档字符串放入cython cdef类中?

时间:2019-07-02 17:31:47

标签: class cython

似乎没有一种简单的方法将文档字符串嵌入到cdef类的属性中。在ipython中运行常规的object.property?help(object.property)时,它不会显示输入的文档字符串,而是显示属性分配给的对象类型的python文档字符串。这与embedsignature = True文件顶部的.pyx指令一起使用。

我正在编写的代码具有许多都会产生此问题的属性,因此,这是到目前为止编写的基本格式:

cdef class foo:

    cdef object _attr 

    def __init__(self, attr = 0):
        self._attr = attr 

    @property 
    def attr(self): 
        """
        The docstring that should be printed.
        """ 
        return self._attr 

    @attr.setter 
    def attr(self, value): 
        self._attr = value 

我还尝试了以下不推荐使用的语法,该语法指出here可以像这样写文档字符串。尽管已弃用,但这表明应该支持cdef classes中属性的文档字符串。

cdef class foo: 

    cdef object _attr 

    def __init__(self, attr = 0): 
        self._attr = attr 

    property attr: 
        """
        The docstring that should be printed. 
        """ 

        def __get__(self): 
            return self._attr 

        def __set__(self, value): 
            self._attr = value 

如果我在ipython中运行bar = foo(),然后运行bar.attr?help(bar.attr),则预期的文档字符串为“应打印的文档字符串”。但是,它显示“如果可能,将字符串转换为浮点数”。 python给定了float类型的文档字符串。

我意识到,解决此问题的另一种方法是仅使用python class而不是cdef class,但是我要实现的对象也将typedef struct对象包装在其中C也在C中为其编写了广泛的子例程库。这排除了简单的Python class包装的可能性。

是否有解决此问题的简单方法?如果没有,我将其解释为cython实现的问题。用户定义对象的文档字符串对于python来说非常重要。

1 个答案:

答案 0 :(得分:0)

Cython的工作方式与与Python完全相同(为了进行测试,我在纯Python中复制了您的示例)。

如果您在class属性上调用help,则会正确获取文档字符串:

  

help(foo.attr)

     

应打印的文档字符串。

但是,如果您对实例属性调用帮助,则会获得有关int的信息:

  

help(foo().attr)

     

关于int对象的帮助:

     

class int(object)

     

...

这是正确的-foo().attr调用属性方法,该方法返回一个整数,该整数将传递给help。该整数无法知道它是从属性返回的,因此使其具有与属性相关联的文档字符串是毫无意义的。