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)
Dare la funzione di '__doc__' attributo (docstring). –
Non è esattamente la stessa cosa. Modificherò la mia domanda per mostrarti. – zondo
Dai un'occhiata alla mia modifica. – zondo