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