2010-10-22 4 views
12

Ich spiele mit Python aufrufbar. Grundsätzlich können Sie eine Python-Klasse definieren und die Methode __call__ implementieren, um die Instanz dieser Klasse aufrufbar zu machen. z. B.Kann Argspec nicht für Python-Callables erhalten?

Modul inspizieren hat eine Funktion getargspec, die Ihnen die Argumentspezifikation einer Funktion gibt. Aber es scheint, dass ich es nicht auf einem abrufbaren Objekt verwenden können:

fn = AwesomeFunction() 
import inspect 
inspect.getargspec(fn) 

Leider bekam ich einen Typeerror:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python2.6/inspect.py", line 803, in getargspec 
    raise TypeError('arg is not a Python function') 
TypeError: arg is not a Python function 

Ich denke, es ist sehr bedauerlich, dass Sie keine aufrufbare Objekt als Funktion behandeln kann , außer ich mache hier etwas falsch?

+0

Danke für mich einen der weniger verbreiteten und verstanden magischer Methoden erinnern, '__call__' –

Antwort

6

Wenn Sie diese Funktionalität benötigen, ist es absolut trivial, eine Wrapper-Funktion zu schreiben, die überprüft, ob fn ein Attribut hat __call__ und wenn ja, übergibt ihre __call__ Funktion getargspec.

5

Wenn Sie sich die Definition von getargspec im Modulcode inspect auf svn.python.org ansehen. Sie werden sehen, dass es isfunction Anrufe, die sich selbst aufruft:

isinstance(object, types.FunctionType) 

Da Ihre AwesomeFunction eindeutig nicht eine Instanz von types.FunctionType ist es funktioniert nicht.

Wenn Sie wollen, dass es Ihnen zu arbeiten, sollte folgendes versuchen:

inspect.getargspec(fn.__call__) 
+5

ich weiß, dass es eine Funktion Typen erwartet. Ich beklagte nur die Tatsache, dass Python nicht so konstruiert wurde, dass Funktionen und Objekte vereinheitlicht werden. – EnToutCas

+1

Es ist hauptsächlich, weil Python keine unverschämt objektorientierte Sprache ist (Java ist mein bestes Beispiel). In Java ist buchstäblich alles ein Objekt, bis zu dem Punkt, an dem die kleinste Einheit der ausführbaren Quelle eine Klasse ist. In Python, da ein solches Paradigma vermieden wurde, fehlen zwar einige Features, aber es ist im Allgemeinen klarer. –

+0

@EnToutCas: Schreiben Sie einen Vorschlag/Patch. Könnte entweder A) akzeptiert werden, oder B) mit einer Begründung abgeschossen werden, die zeigt, warum es eine schlechte Idee ist. –

0

__call__ definiert etwas, das von einer Klasseninstanz aufgerufen werden kann. Sie geben getargspec keine gültige Funktion, weil Sie eine Klasseninstanz übergeben.

Der Unterschied zwischen __init und __call__ dies:

fn = AwesomeFunction() # call to __init__ 
fn(1, 2) # call to __call__ 
Verwandte Themen