2016-02-27 10 views
8

Jeśli wpiszesz help(vars) następujące produkowany jest:funkcja Producent mają wielokropek dla argumentów w pomoc function()

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

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

Kiedy należy wykonać następujące czynności:

def func(x, y): pass 

help(func) 

wyświetla to:

func(x, y) 

Jak mogę to zmienić, aby pojawił się z ... między nawiasami l ike wbudowana funkcja vars()? (To znaczy, func(...))

Edit: Zostało ono zalecane, aby użyć docstring, ale to nie będzie robić to, co chcę. Oto przykład:

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

help(func) 

wynik:

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

Widzisz, x, y jest nadal wyświetlany zamiast ...

+0

Daj Funkcja A '__doc__' atrybutu (docstring). –

+3

To nie jest dokładnie to samo. Będę edytować moje pytanie, aby Ci pokazać. – zondo

+1

Zobacz moją edycję. – zondo

Odpowiedz

8

mieć (co najmniej) dwie alternatywy, aby osiągnąć to, co chcesz.

Najlepszą alternatywą byłoby zastąpienie metody __str__ klasy inspect.Signature. Jednak, jak jest napisane w C, jest tylko do odczytu.

tak zrobić, że trzeba rozszerzyć klasę, jak następuje:

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

następnie po zdefiniowaniu czynność wykonać:

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

które następnie powrócić następujące dla help(func):

Help on function func in module __main__: 

func(...) 
(END) 

Przy takim podejściu inspekcja.signature nadal działa:

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

Alternatywnie, jeśli nie troszczą się o byciu w stanie prawidłowo introspekcji swoją funkcję (i prawdopodobnie kilka innych przypadków użycia), można określić wartość swoich funkcji na __signature__ do obiektu, który nie jest Signature instancja:

def func(x, y): 
    pass 

func.__signature__ = object() 

help(func) 

generuje wynik:

Help on function func in module __main__: 

func(...) 
(END) 

Ale teraz inspect.signature(func) podniesie TypeError: unexpected object <object object at 0x10182e200> in __signature__ attribute.

Uwaga: ta ostatnia wersja jest dość hackowata i nie polecam jej.

Aby uzyskać więcej informacji na temat tych dwóch technik i sposobu działania podpisu, patrz: PEP 0362.

Aktualizacja: dla Pythona 2.7 można wykonać następujące czynności (chyba lepiej przy użyciu mock ramy):

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) 
Powiązane problemy