似乎没有一种简单的方法将文档字符串嵌入到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来说非常重要。
答案 0 :(得分:0)
Cython的工作方式与与Python完全相同(为了进行测试,我在纯Python中复制了您的示例)。
如果您在class属性上调用help
,则会正确获取文档字符串:
help(foo.attr)
应打印的文档字符串。
但是,如果您对实例属性调用帮助,则会获得有关int
的信息:
help(foo().attr)
关于int对象的帮助:
class int(object)
...
这是正确的-foo().attr
调用属性方法,该方法返回一个整数,该整数将传递给help
。该整数无法知道它是从属性返回的,因此使其具有与属性相关联的文档字符串是毫无意义的。