隐藏参数在哪里?

时间:2009-08-09 13:55:32

标签: python

我在这里有这个函数调用:

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 个答案:

答案 0 :(得分:3)

您粘贴的代码片段看起来不错。正如其他人正确地说的那样,为了找到问题,你应该找到仍然存在错误的最少量的代码。

我的建议是

(1)检查是否为您的Python版本编写了模块test_hosts,并且确实是要导入的文件

(2)将class LocalTestHost: def __init__(...函数复制到您的文件中并尝试从那里调用它。如果你得到了#sn params,它会引发像NameError这样的东西。

(3)如果上述功能适合您,请使用运行时内省检查test_hosts.LocalTestHost.__init__()签名。有人可能正在改变它,例如__init__ = staticmethod(__init__)某处(一种定义静态函数的旧方法)。

请告诉我们它是怎么回事!

答案 1 :(得分:2)

另一个想法是:你无意中调用了旧版本的代码。确保你的某处没有.pyc文件。

答案 2 :(得分:1)

我以前见过这些问题,但这是因为前面的代码是以语法正确的方式制作的,但并不是我想要的。

此代码段不足以为我重现问题,至少在OS X上没有2.5.1。

答案 3 :(得分:1)

我的天哪,我是个白痴。我需要更彻底地阅读错误消息。

实际上导致问题的代码实际上并不存在。它是构造函数中的几行。这是:

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函数实际上返回它实例化的另一个对象,它的构造函数(顺便提一下,与我选择的构造函数具有相同的参数)没有收到它应该具有的所有参数。

我没有彻底阅读该消息,我的困惑来自最后一行,说明我已经通过了构造函数太少的参数。现在,我还尝试添加太多参数作为完整性检查,实际上它是我正在挑选的构造函数。我很惊讶我没有看到在这种情况下错误跟踪显着缩短。

我今天学到了宝贵的一课。问题是我认为我已经好几次倾斜了几年。