2016-07-26 3 views
0

Я запускаю небольшой клиент-серверный тест на python, и клиент отправляет слово на сервер. Это слово является именем функции в python, которую нужно вызвать. Поэтому, когда отправляется слово «blink», он должен вызывать функцию «blink». (Пожалуйста, не то, что у них может быть несколько ключевых слов и функция, поэтому она должна быть какой-то формой вызова функции функции).Как использовать переменную как имя функции для вызова в 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

@AlexvanEs Вы комментируете не то место. Но: никогда не используйте 'eval()' с внешними данными, как по соображениям безопасности, так и по соображениям производительности. Вы не хотите, чтобы ** каждый ** код python являлся допустимой командой, но только определенные функции. Использование 'eval' здесь было бы похоже на ожидание посылки, и вместо того, чтобы оставлять заметку, чтобы оставить пакет, вы оставите свои ключи, учетные данные банковского счета и свидетельство о рождении, прикрепленные к двери. –

Смежные вопросы