Как поместить docstring свойства в класс cthon cthon? - PullRequest
0 голосов
/ 02 июля 2019

Кажется, нет простого способа встроить строки документов в свойства классов cdef.При запуске обычного object.property? или help(object.property) в ipython он не показывает строку документации как введенную, а вместо этого показывает строку документации 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 

Я также попробовал следующееустарел синтаксис, который заявляет здесь , что строки документации могут быть написаны так.Несмотря на то, что это устарело, это, тем не менее, указывает на необходимость поддержки строк документации для свойств в 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 

Если я запускаю bar = foo() с последующим bar.attr? или help(bar.attr) в ipython, ожидаемая строка документа будет «Строка документа, которая должна быть напечатана».Однако вместо этого отображается «Преобразовать строку в число с плавающей запятой, если это возможно».который является питоном строки документа, дал тип float.

Я понимаю, что альтернативным решением этой проблемы было бы просто использовать питон class вместо cdef class, но реализуемый мной объект также обертывает объект typedef struct в Cдля которого я написал обширную библиотеку подпрограмм также в C.Это исключает возможность простого переноса в python class.

Есть ли простое решение этой проблемы?Если нет, я бы интерпретировал это как проблему с реализацией Cython;строки документации для пользовательских объектов довольно важны для Python.

1 Ответ

0 голосов
/ 03 июля 2019

Cython работает и ведет себя точно так же, как Python (для тестирования я продублировал ваш пример на простом Python).

Если вы вызовете help для атрибута класса, вы получите строку документа правильно:

help(foo.attr)

Строка документации, которая должна быть напечатана.

Однако, если вы вызовете справку по атрибуту экземпляра, вы получите информацию о int:

help(foo().attr)

Справка по объекту int:

класс int (объект)

...

Это правильно - foo().attr вызывает метод свойства, который возвращает целое число, то есть то, что передается в help. Это целое число не может знать, что оно было возвращено из свойства, поэтому для него не имеет смысла связывать строку документации со свойством.

...