2016-07-29 13 views
0

wenn ich führen Sie diesen Code:str Objekt ist nicht aufrufbar - eine Funktion mit einer Funktion/string als Argument Aufruf

clffunc = sys.argv[1]  

def fun(clffunc): 
     error_vector = clffunc() 
     print error_vector 
     loss_total = sum(error_vector) 
     loss_mean = np.mean(error_vector) 
     print "The mean error is %.2f" % loss_mean 

def svm_clf(): 
     #The clasificator object 
     clf = svm.SVC() 
     clf.fit(train_features, train_targets) 
     # Prediction 
     test_predicted = clf.predict(test_features) 
     # Analysis and output 
     return np.absolute(test_predicted-test_targets) 

if __name__ == "__main__": 
     fun(clffunc) 

vom Terminal als:

python GraspT.py svm_clf 

ich die folgende Fehlermeldung erhalten :

Im Internet konnte ich keine Lösung finden. 'str' Objekt ist nicht aufrufbar ist fast immer getan, wenn jemand eine eingebaute Funktion oder etwas ähnliches neu definiert. Das ist nicht mein Fall. Hier übergebe ich einen String vom Terminal, und dann wird dies als String in einem Funktionsargument verwendet. Dieses Argument ist in der Tat eine Funktion. Ich möchte also die Funktion (eine Klassifikationsmethode im maschinellen Lernen) auswählen, die im Code ausgeführt wird.

+0

Warum Sie versuchen 'clffunc' zu nennen? Sie haben es als Parameter an Ihr Skript übergeben, was es zu einer Zeichenkette macht. –

+0

Ich wähle die Ausführung von svm_clf() unter anderen Funktionen. Wenn ich explizit Spaß schreibe (svm_clf), gibt es keine Fehler. Ich denke, dass svm_clf eine Zeichenfolge ist. Aber wenn ich die gleiche Zeichenfolge von der Befehlszeile übergeben, zeigt es mir den Fehler – prometeu

Antwort

1

svm_clf ist ein String, kein Funktionsobjekt. Die Inhalte dieser Zeichenfolge möglicherweise den Namen einer Funktion, aber das macht es nicht diese Funktion.

Sie könnten das ein Wörterbuch verwenden gültige Namen zuordnen funktionieren:

functions = {'svm_clf': svm_clf} 

if __name__ == "__main__": 
    fun(function[clffunc]) 

oder Sie können das Wörterbuch, dass globals() kehrt zu diesem Zweck verwendet werden:

if __name__ == "__main__": 
    fun(globals()[clffunc]) 

Dieses in einem wohl in Ordnung ist Verwenden Sie das Befehlszeilentool, berücksichtigen Sie jedoch, dass der Benutzer des Tools das Skript dazu veranlassen kann, alles mit einem globalen Namen aufzurufen.

+0

Vielen Dank für die schnelle Antwort. Dein erster Vorschlag hat das Problem gelöst. – prometeu

0

Sie könnten direkt auf den globals zugreifen und durch den Funktionsnamen indexieren.

def some_func(): 
    print 'called some_func!' 

def some_other_func(): 
    print 'called some_other_func!' 

globals()['some_func']() 
globals()['some_other_func']() 

globals()[sys.argv[1]]() 

Auch könnten Sie mit eval betrachten.

0
import sys 

def foo(): sys.stdout.write("foo called\n") 
def foo1(): sys.stdout.write("foo1 called\n") 

if __name__ == "__main__": 
    if len(sys.argv) < 2:   # prevent IndexError 
     sys.stdout.write("Use commandline argument: foo or foo1\n") 
     sys.exit()     # Print --help and exit 
    name = sys.argv[1]    # Get name (str is) 
    m = sys.modules["__main__"]  # Get main module instance obj 
    if hasattr(m, name):    # Check attribute exists 
     a = getattr(m, name)   # Get attribute by str-name 
     if hasattr(a, '__call__'): # Verify callable is? 
      a()      # Call 
     else: 
      sys.stderr.write("ERROR: is not some callable '%s'\n" % name) 
      sys.exit(1) 
    else: 
     sys.stderr.write("ERROR: has no attr named '%s'\n" % name) 
     sys.exit(1) 
0

Das Problem ist, dass Sie nicht richtig verstehen, was Sie erreichen möchten.

clffunc = sys.argv[1]  

def fun(clffunc): 
     error_vector = clffunc() 

Sie versuchen, eine Zeichenfolge aufzurufen. sys.argv[1] gibt das zweite Argument als Zeichenfolge zurück. Sie tun dies: "svm_clf"(). Die einfache Lösung besteht darin, die eval Gebäudefunktion zu verwenden. Zum Beispiel: eval('%s()' % clffunc). Dieser Ausdruck wird definitiv den Job machen :).

Korrektur, die es funktioniert sollte:

if __name__ == "__main__": 
    fun(eval(clffunc)) 
+0

Ich weiß, was ich zu erreichen versuche und ich habe es auf verschiedene Arten erreicht. Aber weil ich neu bei Python bin, experimentierte ich mit dem, was ich gelernt habe, indem ich verschiedene Dinge ausprobierte.Bei einem von ihnen bekam ich Code-Fehler, die ich nicht lösen konnte (vielleicht weil es gegen 21:00 Uhr ist) und ich fragte nach (oder wollte ich vielleicht mit einigen anderen Python-Programmierern reden) – prometeu

+0

das ist ok solange es funktioniert für dich hast du eine lösung gefunden? – flipvarga

Verwandte Themen