Где скрытый параметр? - PullRequest
       3

Где скрытый параметр?

1 голос
/ 09 августа 2009

У меня есть этот вызов функции здесь:

import test_hosts

test_hosts.LocalTestHost(mst, port, local_ip, remote_if_mac, remote_if_ip, service_port)

и когда я запускаю его, интерпретатор не работает и говорит, что я передаю 6 параметров в функцию, которая получает 7 параметров.

LocalTestHost - это класс, его конструктор принимает параметр self и шесть других: всего 7 параметров. Это декларация:

class LocalTestHost:

    def __init__(self, mst, port, local_ip, remote_if_mac, remote_if_ip, service_port):
        ...

Я часами смотрел на этот код и не могу найти проблему. Когда я запускаю это как есть, это дает сбой, потому что я передаю 6 параметров, что слишком мало, если я вызываю конструктор с добавленным параметром, просто чтобы убедиться, что я все еще могу считать, он говорит, что я передаю 8 параметров, что слишком много.

Ответы [ 4 ]

3 голосов
/ 10 августа 2009

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

Мое предложение будет

(1) проверьте, что модуль test_hosts написан для вашей версии Python и действительно ли это импортируемый файл

(2) скопируйте функцию class LocalTestHost: def __init__(... в ваш файл и попробуйте вызвать ее оттуда. Это вызовет что-то вроде NameError, если вы правильно укажете # params.

(3), если вышеуказанная функция работает для вас, проверьте подпись test_hosts.LocalTestHost.__init__(), используя интроспекцию во время выполнения. кто-то может изменить это, например, __init__ = staticmethod(__init__) где-то (старый метод определения статических функций).

И, пожалуйста, расскажите нам, как это происходит!

2 голосов
/ 09 августа 2009

Другая идея: вы случайно вызываете старую версию кода. Убедитесь, что у вас нет файла .pyc где-то рядом.

1 голос
/ 11 августа 2009

Боже мой, я был идиотом. Мне нужно начать читать сообщения об ошибках более тщательно.

Код, который фактически вызвал проблему, на самом деле не был здесь. Это было несколько строк внутри конструктора. Вот оно:

class LocalTestHost:

    def __init__(self, mst, port, local_ip, remote_if_mac, remote_if_ip, service_port):
        .
        . <some initialization code>
        .

        # This is the faulty line
        self.__host_operations = HostOperationsFactory().create(
                        local_ip, port, mst, remote_if_ip)

А вот и сообщение об ошибке, я не читал и по глупости не отвечал со своим вопросом:

>>> test_hosts.LocalTestHost(1,2,3,4,5,6)
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "test_hosts.py", line 709, in __init__
    self.__host_operations = HostOperationsFactory().create(
  File "test_hosts.py", line 339, in create
    remote_ip)
  File "test_hosts.py", line 110, in __init__
    packet_size, remote_ip)
TypeError: __init__() takes exactly 7 arguments (6 given)

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

Я не прочитал сообщение полностью, и моя путаница возникла из-за того, что я передал конструктору слишком мало параметров. Теперь я также попытался добавить слишком много параметров для проверки работоспособности, и там на самом деле это был конструктор, который я выбрал. Я удивлен, что не увидел, что в этом случае трассировка ошибок была значительно короче.

Сегодня я усвоил ценный урок. Проблема в том, что, по-моему, я несколько раз склонялся к этому уже несколько лет.

1 голос
/ 09 августа 2009

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

Этого фрагмента недостаточно, чтобы воспроизвести проблему для меня, по крайней мере, не в 2.5.1 на OS X.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...