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

У меня есть много вызываемых объектов, и все они имеют строку __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)

Ответ 1

Функция help (реализована в модуле pydoc) не подготовлена ​​для поиска docstrings для каждого экземпляра. Я быстро просмотрел модуль, чтобы узнать, есть ли способ предоставить явную помощь, но, похоже, этого не происходит. Он использует модуль 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

Ответ 2

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

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

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

>>> 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" '

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