2016-06-23 8 views
2

Ich bin neu in Python und versuchte, ein Wörterbuch mit Wert als Funktion zu erstellen. hier mein CodeWie Funktion übergeben mit Parametern in einem Wörterbuch Schlüsselwert-Paar

ist
import os 

class Foo(): 
    def print1(self,n): 
     print 5 


    def print2(self,n): 
     print 6 

    def foo(self): 
     bar = {'a': self.print1, 'b': self.print2} 
     bar['b'](5) 
     bar['a'](3) 
     bar[os.environ['FOO']]() 


f = Foo() 
f.foo() 

Traceback (most recent call last): 
    File "test_dict.py", line 17, in <module> 
    f.foo() 
    File "test_dict.py", line 13, in foo 
    bar[b]() 

python test_dict.py 
6 
5 
    Traceback (most recent call last): 
     File "test_dict.py", line 19, in <module> 
     f.foo() 
     File "test_dict.py", line 15, in foo 
     bar[os.environ['FOO']]() 
    TypeError: print2() takes exactly 2 arguments (1 given) 
+0

Ihre Funktionen nichts zurückkehr. So ist 'bar [b]' 'None'. Und so, der Fehler, 'NoneType nicht aufrufbar' – SvbZ3r0

+1

Es gibt keinen Grund, dass Sie nicht aufrufbar als ein Wörterbuch Wert setzen können. In diesem Fall schreiben Sie jedoch * die Ausgabe der Funktionen * in das Wörterbuch. – jonrsharpe

+0

Was kann os.environ ['FOO'] '' 'bewerten? – wwii

Antwort

0

Versuchen Sie diesen Code verwenden:

class Foo(): 
    def print1(self,n): 
     print 6 

    def print2(self,n): 
     print n 

    def foo(self): 
     bar = {'a': self.print1, 'b': self.print2 } 
     bar['b'](5) 
     bar['a'](3) 

f = Foo() 
f.foo() 

es tut, was Sie wollen.

+0

der obige Kommentar gibt mir immer noch den Fehler. Hier ist der Code: 'import os Klasse Foo(): def print1 (self): Druck 5 def print2 (self): Druck 6 def foo (self): bar = {' a ': self.print1,' b ': self.print2} Balken [' b '] (5) Balken [' a '] (3) Balken [os.environ [' FOO ']]() f = Foo() f.foo()‘ – user3034987

+0

und hier ist der Fehler: Traceback (jüngste Aufforderung zuletzt): File "test_dict.py", Zeile 19, in f.foo() Datei "test_dict.py", Zeile 13, in foo Balken ['b'] (5) TypeError: print2() benötigt genau 1 Argument (2 gegeben) – user3034987

+0

@ user3034987 Genau dieser Code funktioniert für mich.Sie sollten Ihre Frage so aktualisieren, dass sie genau den Code enthält, den Sie ausführen möchten. – DeepSpace

-1

Die Art und Weise Sie es tun, wird die Funktion aufgerufen und das Ergebnis gespeichert wird (die keine ist, weil Sie nichts zurück), wenn Sie die Funktion sein aufrufbar als solche wollen, Sie könnte entweder ein lambda um es schreiben oder functools.partial

+0

Was ist falsch daran, einfach den Namen ohne Klammern zu übergeben? –

+0

Nichts, es kam mir nicht in den Sinn, dass das sein könnte, was er wollte. Der Code sieht für mich so aus, als ob er einen Parameter fixieren wollte, was der Zweck von partiell ist. Dann könnte es als bar [b]() statt bar [b] (5) aufgerufen werden. – phogl

+0

Sie haben Recht ... Es klingt, als ob er die Funktion mit einem Argument übergeben wollte. Das wäre nur mit der Referenz nicht möglich. Aber der Sinn hinter all dem ist sehr fragwürdig ... ^^ –

1

bar = {'a': self.print1(6), 'b': self.print2(5) } speichert die Funktionen nicht als Werte im Wörterbuch.

Es ruft die Funktionen print1 und print2 auf und speichert ihre Rückgabewerte. Da beide Funktionen nur print sind und nichts zurückgeben, erhalten Sie das Wörterbuch {'a': None, 'b': None } weshalb Sie die NoneType Ausnahme bekommen.

Stattdessen sollten Sie tun:

bar = {'a': self.print1, 'b': self.print2 }

Dann:

bar['b'](5) 
>> 5 
+0

Versucht, dass auch, aber es hat nicht funktioniert. Siehe meine Kommentare im obigen Beitrag. – user3034987

+0

@ user3034987 Genau dieser Code funktioniert für mich. Sie sollten Ihre Frage so aktualisieren, dass sie genau den Code enthält, den Sie ausführen möchten. – DeepSpace

+0

aktualisiert den Code mit dem genauen Code, den ich laufen und die Ausgabe ich bekomme. Ich setze FOO als b in diesem Fall – user3034987

Verwandte Themen