Где функция 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" '
Надеюсь, что это поможет