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)
¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top