¿De dónde viene función de ayuda pydoc de Python obtener su contenido?
-
21-09-2019 - |
Pregunta
tengo una gran cantidad de objetos no desembolsadas, y todos ellos tienen la cadena __doc__
llenado correctamente, pero el funcionamiento de ayuda en ellos produce la ayuda de su clase en lugar de ayuda basado en __doc__
.
Quiero cambiarlo por lo que la ejecución de la ayuda de ellos produce ayuda a medida que se ve esencialmente como lo que se obtendría si fueran funciones reales en vez de instancias de una clase que implementa __call__
.
En el código, me gustaría que la salida de esta:
class myCallable:
def __init__(self, doc):
self.__doc__ = doc
def __call__(self):
# do some stuff
pass
myFunc = myCallable("some doco text")
help(myFunc)
parecerse más a la salida de este:
def myFunc():
"some doco text"
# do some stuff
pass
help(myFunc)
Solución
La función help
(implementado en el módulo pydoc
) no está preparado para encontrar docstrings por instancia. Me echó un vistazo rápido a través del módulo para ver si había una manera de proporcionar ayuda explícita, pero no parece ser. Utiliza el módulo inspect
para determinar qué tipo de cosa que es, y su myFunc no se ve como una función, se ve como una instancia. Así impresiones pydoc ayuda acerca de la clase de la instancia en su lugar.
Sería bueno si similar a __doc__
se podría añadir un atributo __help__
, pero no hay apoyo para eso.
No me atrevo a sugerir, pero su mejor opción podría ser la de definir una nueva función help
:
old_help = help
def help(thing):
if hasattr(thing, '__help__'):
print thing.__help__
else:
old_help(thing)
y luego poner un atributo __help__
en sus instancias:
class myCallable:
def __init__(self, doc):
self.__doc__ = doc
self.__help__ = doc
Otros consejos
No estoy muy claro acerca de lo que su pregunta es exactamente. Mi entendimiento es que usted tiene una clase y una función definida en él y quiere saber dónde Python obtiene el texto de ayuda para que la función de.
Python obtiene el texto de ayuda de las cadenas de documentación previstas en esa clase / método.
Si usted tiene una clase "A" y una "f" método en el que la clase y hay cadenas de documentación en la función "f", entonces el siguiente volcado terminal debería ayudar a aclarar su pregunta:
>>> 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" '
Espero que esto ayude