2016-07-26 18 views
0

Ich führe einen kleinen Client-Server-Test in Python und der Client sendet ein Wort an den Server. Dieses Wort ist der Name einer Funktion in Python, die aufgerufen werden muss. Wenn also das Wort "Blinken" gesendet wird, sollte es die Funktion "Blinken" aufrufen. (Bitte beachten Sie, dass es sich dabei um mehrere Schlüsselwörter und Funktionen handeln könnte, so dass es sich um eine Form von Variablenfunktionsaufrufen handeln muss).Wie benutze ich eine Variable als Funktionsname zum Aufruf von Python

while True: 
    s.listen(1) 
    conn, addr = s.accept() 
    print 'Connection address:', addr 
    while 1: 
      data = conn.recv(BUFFER_SIZE) 
      if not data: break 
      if data == "blink": 
        print "MATCH!" 
        call(data()) 
      print "received:",data 
      call(data()) 
    print "break" 

Das Wort MATCH wird gedruckt, um das Wort eindeutig zu erhalten. Wie benutze ich jetzt die variablen Daten, um die Funktion blinkend aufzurufen?

ich jetzt

TypeError: 'str' object is not callable

ich den Fehler verstehen kann .. klar muss ich etwas mit dieser Zeichenfolge tun .. irgendwelche Ideen?

+0

'data()', Sie versuchen, ein String-Objekt zu nennen. Vielleicht meinst du 'call (data)'? –

+1

Sie könnten eval oder exec verwenden, um dies zu tun. Siehe http://stackoverflow.com/questions/2220699/whats-the-difference-between-eval-exec-and-compile-in-python – Dan

+2

@Dan Nein. Nein Nein Nein. Bitte verwenden Sie nicht 'eval' oder' exec'. –

Antwort

2

Sie können dict verwenden, um Ihre Daten der Funktion zuzuordnen, die Sie anrufen möchten.

Funktionen sind Bürger erster Klasse in Python und kann wie folgt verwendet werden:

def blink(): 
    print('Blink') 

func = {'blink':blink} 
# 'blink' is data you receive; 
# blink is the function you want to call 
data = 'blink' 

func[data]() 
+1

Code-only-Antworten sind etwas veraltet; Bitte schreibe warum und was du hier machst –

+0

Eval arbeitete für mich .. aber @Morgan Thrapp warum nicht verwenden? –

+2

@AlexvanEs Sie kommentieren an der falschen Stelle. Aber: Verwenden Sie 'eval()' niemals mit externen Daten, sowohl aus Sicherheitsgründen als auch aus Gründen der Leistung. Sie wollen nicht, dass ** jeder ** Python-Code ein gültiger Befehl ist, sondern nur bestimmte Funktionen. Die Verwendung von 'eval' wäre hier so, als würde man ein Paket erwarten, und anstatt eine Notiz zu hinterlassen, um das Paket zu verlassen, würden Sie Ihre Schlüssel, Ihre Bankkontoregistrierungen und die Geburtsurkunde an die Tür hängen lassen. –