2016-07-26 64 views
0

我正在python中運行一個小型的客戶端 - 服務器測試,並且客戶端向服務器發送一個單詞。這個詞是python中需要調用的函數的名稱。所以當發送「閃爍」一詞時,它應該調用「閃爍」功能。 (請不要指出它們可能是幾個關鍵字和函數,所以它需要是某種形式的可變函數調用)。如何使用變量作爲函數名來調用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" 

單詞MATCH被打印以清楚地顯示該單詞被接收。如何使用變量數據調用函數blink?

我現在得到

TypeError: 'str' object is not callable

我能理解的錯誤。顯然,我需要做的是字符串..任何想法的東西嗎?

+0

'數據()',你想叫一個字符串對象。也許你的意思是'call(data)'? –

+1

您可以使用eval或exec來執行此操作。請參閱http://stackoverflow.com/questions/2220699/whats-the-difference-between-eval-exec-and-compile-in-python – Dan

+2

@丹否。否否否。請不要使用'eval'或'exec'。 –

回答

2

您可以使用dict將您的數據映射到您要調用的功能。

功能在Python的一等公民,可以像下面的使用:

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

僅有代碼的答案有點過時;請寫下你爲什麼和在這裏做什麼 –

+0

Eval爲我工作..但@Morgan Thrapp爲什麼不使用它? –

+2

@AlexvanE你在錯誤的地方發表評論。但是:出於安全原因和性能原因,切勿對外部數據使用'eval()'。你不希望**每個** python代碼都是一個有效的命令,但只有特定的功能。在這裏使用'eval'就像是期待一個包裹,而不是留下一張紙幣離開包裹,你會留下你的鑰匙,你的銀行賬戶憑證和出生證明被鎖定在門外。 –

相關問題