Где функция Python помощи pydoc получает свой контент?

У меня много вызываемых объектов, и все они имеют __doc__ строка правильно заполнена, но запуск справки для них дает справку для их класса вместо справки на основе __doc__,

Я хочу изменить это так, чтобы при запуске справки для них создавалась настраиваемая справка, которая по сути выглядит так, как если бы они были действительными функциями, а не экземплярами класса, который реализует __call__,

В коде я хотел бы сделать вывод этого:

class myCallable:
    def __init__(self, doc):
        self.__doc__ = doc

    def __call__(self):
        # do some stuff
        pass

myFunc = myCallable("some doco text")
help(myFunc)

Больше похоже на результат этого:

def myFunc():
    "some doco text"
    # do some stuff
    pass

help(myFunc)

2 ответа

Решение

help функция (реализована в pydoc модуль) не готов найти строки документации для каждого экземпляра. Я быстро просмотрел модуль, чтобы увидеть, есть ли способ предоставить явную помощь, но, похоже, его нет. Он использует inspect модуль, чтобы определить, что это за штука, и ваш myFunc не похож на функцию, он выглядит как экземпляр. Таким образом, pydoc печатает справку о классе экземпляра.

Было бы хорошо, если бы похоже на __doc__ Вы могли бы добавить __help__ атрибут, но нет поддержки для этого.

Я не решаюсь предложить это, но лучше всего было бы определить новый help функция:

old_help = help
def help(thing):
    if hasattr(thing, '__help__'):
        print thing.__help__
    else:
        old_help(thing)

а затем положить __help__ атрибут на ваших экземплярах:

class myCallable:
    def __init__(self, doc):
        self.__doc__ = doc
        self.__help__ = doc

Мне не очень понятно, в чем конкретно твой вопрос. Насколько я понимаю, у вас есть класс и определенная функция, и вы хотите знать, откуда Python получает текст справки для этой функции.

Python получает текст справки из строк документации, предоставленных в этом классе / методе.

Если у вас есть класс "A" и метод "f" в этом классе, а в функции "f" есть строки документации, то следующий дамп терминала должен помочь в решении вашего вопроса:

>>> class A:
        def __init__(self):
            self.c = 0   # some class variable
        def f(self, x):
            """this is the documentation/help text for the function "f" """
            return x+1

>>> help(A.f)
Help on method f in module __main__:

f(self, x) unbound __main__.A method
this is the documentation/help text for the function "f" 

>>> A.f.__doc__
'this is the documentation/help text for the function "f" '

Надеюсь это поможет

Другие вопросы по тегам