2016-07-26 2 views
0

파이썬에서 작은 클라이언트 - 서버 테스트를 실행 중이며 클라이언트가 서버에 단어를 보냅니다. 이 단어는 파이썬에서 호출해야하는 함수의 이름입니다. 따라서 "blink"라는 단어가 전송되면 "blink"라는 함수를 호출해야합니다. (이들이 여러 키워드와 함수가 될 수 있으므로 어떤 형태의 함수 호출이 필요합니다.)변수를 함수 이름으로 사용하여 파이썬 호출하기

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

@ Dan No. 아니요 아니요. 'eval' 또는'exec'을 사용하지 마십시오. –

답변

2

dict을 사용하여 데이터를 호출 할 기능에 매핑 할 수 있습니다.

기능 파이썬에서 최고 수준의 시민이며, 다음과 같이 사용할 수 있습니다

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

@AlexvanEs 당신이 틀린 장소에서 논평하고 있습니다. 하지만 : 보안상의 이유로, 그리고 성능상의 이유 때문에 결코 외부 데이터와 함께'eval()'을 사용하지 마십시오. ** 모든 ** 파이썬 코드가 유효한 명령이 아니라 특정 기능 만 필요로합니다. 여기서'eval'을 사용하는 것은 소포를 기대하는 것과 같을 것이고, 패키지를 떠나기 위해 메모를 남기는 대신 은행 계좌 신임장과 출생 증명서가 문에 고정되어있는 열쇠를 남겨 두는 것입니다. –