2016-02-27 23 views
8

Se si digita help(vars), viene prodotto il seguente:funzione di fare avere i puntini di sospensione per gli argomenti in aiuto la funzione()

vars(...) 
    vars([object]) -> dictionary 

    Without arguments, equivalent to locals(). 
    With an argument, equivalent to object.__dict__. 

Quando faccio la seguente:

def func(x, y): pass 

help(func) 

visualizza questo:

func(x, y) 

Come posso cambiarlo in modo che si visualizzi con ... tra le parentesi l ike la funzione built-in vars()? (Ovvero, func(...))

Modifica: È stato suggerito di utilizzare una docstring, ma che non farà ciò che voglio. Ecco un esempio:

def func(x, y): 
    """func(...) -> None""" 

help(func) 

risultato:

func(x, y) 
    func(...) -> None 

Vedete, x, y continua a essere visualizzato invece di ...

+0

Dare la funzione di '__doc__' attributo (docstring). –

+3

Non è esattamente la stessa cosa. Modificherò la mia domanda per mostrarti. – zondo

+1

Dai un'occhiata alla mia modifica. – zondo

risposta

8

Devi (almeno) due alternative per ottenere ciò che si desidera.

L'alternativa migliore sarebbe quella di ignorare il metodo __str__ della classe inspect.Signature. Tuttavia, come è scritto in C, è di sola lettura.

Quindi, per fare questo è necessario estendere la classe come segue:

class MySignature(inspect.Signature): 
    def __str__(self): 
    return '(...)' 

poi dopo aver definito la funzione si esegue:

func_signature = inspect.signature(func) 
func.__signature__ = MySignature(func_signature.parameters.values(), 
           return_annotation=func_signature.return_annotation) 

che sarebbe poi restituire il seguente per help(func):

Help on function func in module __main__: 

func(...) 
(END) 

Con questo approccio inspect.signature funziona ancora:

In [1]: inspect.signature(func) 
Out[1]: <MySignature (...)> 

In alternativa, se non si ha realmente a cuore essere in grado di introspezione correttamente la funzione (e probabilmente alcuni altri casi d'uso), allora si può definire il valore della funzione di __signature__ ad un oggetto che non è un Signature esempio:

def func(x, y): 
    pass 

func.__signature__ = object() 

help(func) 

genera il risultato:

Help on function func in module __main__: 

func(...) 
(END) 

Ma ora inspect.signature(func) alzerà TypeError: unexpected object <object object at 0x10182e200> in __signature__ attribute.

Nota: questa ultima versione è abbastanza hacky e non la consiglierei.

Per ulteriori informazioni su queste due tecniche e su come funziona la firma, vedere PEP 0362.

Aggiornamento: per Python 2.7 è possibile effettuare le seguenti operazioni (probabilmente meglio utilizzando un quadro finto):

In [1]: import inspect 

In [2]: def myformatargspec(*args, **kwargs): 
    ...:  return '(...)' 
    ...: 

In [3]: def func(x, y): 
    ...:  pass 
    ...: 

In [6]: inspect.formatargspec = myformatargspec 

In [7]: help(func) 

Help on function func in module __main__: 

func(...) 
(END)