Pergunta

Eu tenho muitos objetos que podem ser chamados e todos eles têm o __doc__ string preenchida corretamente, mas executar help neles produz a ajuda para sua classe em vez de ajuda baseada em __doc__.

Quero alterá-lo para que a execução da ajuda neles produza uma ajuda personalizada que se pareça essencialmente com o que eu obteria se fossem funções reais em vez de instâncias de uma classe que implementa __call__.

No código, gostaria de fazer a saída disto:

class myCallable:
    def __init__(self, doc):
        self.__doc__ = doc

    def __call__(self):
        # do some stuff
        pass

myFunc = myCallable("some doco text")
help(myFunc)

Parece mais com o resultado disso:

def myFunc():
    "some doco text"
    # do some stuff
    pass

help(myFunc)
Foi útil?

Solução

O help função (implementada no pydoc module) não está preparado para encontrar docstrings por instância.Dei uma olhada rápida no módulo para ver se havia uma maneira de fornecer ajuda explícita, mas parece que não há.Ele usa o inspect módulo para determinar que tipo de coisa é, e seu myFunc não se parece com uma função, parece uma instância.Portanto, as impressões do pydoc ajudam sobre a classe da instância.

Seria bom se fosse semelhante a __doc__ você poderia adicionar um __help__ atributo, mas não há suporte para isso.

Hesito em sugerir isso, mas sua melhor aposta talvez seja definir um novo help função:

old_help = help
def help(thing):
    if hasattr(thing, '__help__'):
        print thing.__help__
    else:
        old_help(thing)

e depois coloque um __help__ atributo em suas instâncias:

class myCallable:
    def __init__(self, doc):
        self.__doc__ = doc
        self.__help__ = doc

Outras dicas

Não estou muito claro sobre qual é exatamente a sua pergunta.Meu entendimento é que você tem uma classe e uma função definidas nela e deseja saber de onde o Python obtém o texto de ajuda para essa função.

Python obtém o texto de ajuda das strings de documentos fornecidas nessa classe/método.

Se você tiver uma classe "A" e um método "f" nessa classe e houver docstrings na função "f", o seguinte dump do terminal deverá ajudar a esclarecer sua dúvida:

>>> 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 isto ajude

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top