Питон думает, что я передаю больше аргументов, чем я? - PullRequest
10 голосов
/ 11 августа 2011

Попытка настроить некоторый базовый код сокета в Python (ну, Jython, но я не думаю, что это актуально здесь).

import socket
class Foo(object):
    def __init__(self):
        #some other init code here

        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect("localhost", 2057)
        s.send("Testing 1,2,3...")
        data = s.recv()
        s.close()
        print data

Он говорит мне:

    s.connect("localhost", 2057)
  File "<string>", line 1, in connect
TypeError: connect() takes exactly 2 arguments (3 given)

У меня такое ощущение, что что-то очень простое смотрит мне в лицо, но я не могу сказать, что я делаю неправильно.

Ответы [ 6 ]

12 голосов
/ 11 августа 2011

Вы должны передать Tuple методу connect().

s.connect( ('localhost', 2057) )

Первый (неявный) ожидаемый аргумент - self, второй - Tuple.

9 голосов
/ 11 августа 2011

Вы передаете три аргумента! s передается как неявный первый аргумент, а два других указанных вами аргумента - второй и третий аргументы.

Теперь причина этого в том, что socket.connect() принимает только один аргумент (два, конечно, если считать неявный аргумент экземпляра): см. Документы .

4 голосов
/ 11 августа 2011

Функция сокета connect используется для подключения сокета к удаленному адресу. Для IP-сокетов адрес является парой (хост, порт)

Так что вы должны использовать:

s.connect( ("localhost", 2057) )
4 голосов
/ 11 августа 2011
s.connect(("localhost", 2057))

Третий (или первый) аргумент, который вы косвенно передаете, - self (s).

Сокеты принимают кортеж, состоящий из (HOST, PORT).

3 голосов
/ 11 августа 2011

использование:

s.connect(("localhost", 2057))
0 голосов
/ 11 августа 2011

В socket.connect допускается только 1 аргумент, то есть адрес, 2, если считать себя А формат адреса указан в четвертом абзаце http://docs.python.org/library/socket.html

...