2017-01-23 3 views
-1

У меня есть функция:Несколько функциональных параметров?

def sendMessage(s, message): 
    messageTemp = "PRIVMSG #" + CHANNEL + " :" + message 
    s.send((messageTemp + "\r\n").encode()) 

Я может выводить одно сообщение в чате, в сервере дергаться, используя эту функцию, но когда я хочу, чтобы вывести сообщение, которое имеет переменные в нем так:

sendMessage(s, var1, "message1", var2, "message2") 

Я получаю ошибку: TypeError: sendMessage() takes 2 positional arguments but 5 were given.

Я понимаю, что в функции он ограничен (s, message), но мне было интересно, если бы это было так? Я буду использовать эту функцию много раз во время своей программы, каждый раз, когда количество используемых переменных будет отличаться, поэтому я не могу установить конкретные ограничения для этой функции.

+2

Почему вы не просто сцепить 'var1',' "message1" ',' var2' и '" message2 "' в одну строку и передать это? – blacksite

+0

Не могли бы вы объяснить это немного? Я новичок в python/encoding в целом. Если я попытаюсь запустить его так: sendMessage (s, "var1 message1 var2 message2), он не обрабатывает переменные var1 и var2 как. – Tigel

+0

Вкратце: вы отправляете неправильное количество аргументов функции, которую вы определили. – TigerhawkT3

ответ

2

Вы можете конкатенации/интерполировать/форматировать строку, прежде чем передать его в функцию:

sendMessage(s, var1 + " message1 " + var2 + " message2") 
sendMessage(s, "%s message1 %s message2" % (var1, var2)) 

Или вы можете сделать, как print() и принимать переменное число аргументов, упаковка второй через п-го в кортеж, а затем разобраться с тем, что вы хотите в своей функции. Такие как:

def sendMessage(s, *message): 
    messageTemp = "PRIVMSG #" + CHANNEL + " :" + " ".join(map(str, message)) 
    s.send((messageTemp + "\r\n").encode()) 

Тогда приведенный вам пример работы будет работать! В качестве бонуса, все еще работает.

+0

Я сделал это, и он работает, и я получаю правильный результат в среде IDE, но он не выводит его в твитер-чат, как и мои другие команды. – Tigel

+0

После игры с ним я понял это. Большое спасибо! – Tigel

0

Если вы действительно хотите использовать функцию sendMessage(), измените определение функции, чтобы разрешить неограниченное количество параметров. This part of the Python tutorial объясняет, как это сделать. Если вы хотите, чтобы отделить различные части вашего сообщения пробелами, вы можете использовать

def sendMessage(s, *args): 
    messageTemp = "PRIVMSG #" + CHANNEL + " :" 
    for msg in args: 
     messageTemp = messageTemp + " " + str(msg) 
    s.send((messageTemp + "\r\n").encode()) 

Это объединяет строковые представления ваших различных частей вашего сообщения в одну строку. Это также позволяет использовать различные типы для частей вашего сообщения, если каждый тип имеет подходящее строковое представление.

0

Вы можете добавить «kwargs» в качестве параметра, который обозначает аргументы ключевых слов. Затем функция может принимать любое количество пар значений ключа, которые вы хотите передать в нее. Например:

четкости SendMessage (с, сообщение, ** kwargs)

SendMessage (s, сообщение, var1 = "message1", var2 = "message2")

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