隐藏参数在哪里?

1 投票
4 回答
2026 浏览
提问于 2025-04-15 13:29

我这里有一个函数调用:

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 个回答

2

还有一个想法:你可能不小心调用了旧版本的代码。确保你的文件夹里没有多余的 .pyc 文件。

3

你粘贴的代码片段看起来没问题。正如其他人所说的,要找到问题所在,你需要找出最小的代码量,这部分代码仍然有错误。

我的建议是:

(1) 检查一下模块 test_hosts 是否是为你当前的 Python 版本编写的,并且确认确实是这个文件被导入了。

(2) 把 class LocalTestHost: def __init__((... 这个函数复制到你的文件里,然后试着从那里调用它。如果参数数量对了,它会抛出类似 NameError 的错误。

(3) 如果上面的函数对你有效,检查一下 test_hosts.LocalTestHost.__init__() 的签名,看看运行时的情况。可能有人在某个地方通过 __init__ = staticmethod(__init__) 这种方式改变了它(这是一种旧的定义静态函数的方法)。

请告诉我们结果如何!

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 函数实际上返回了它实例化的另一个对象,而它的构造函数(碰巧和我关注的构造函数参数一样)没有收到它应该有的所有参数。

我没有仔细阅读信息,我的困惑来自于最后一行,说明我给构造函数传递的参数太少了。现在,我还尝试添加了太多参数来做个 sanity check(理智检查),结果发现确实是我关注的那个构造函数出问题了。让我惊讶的是,在这种情况下,错误信息的追踪确实短了很多。

今天我学到了一个宝贵的教训。问题是,我觉得我已经学过好几次了,这些年里。

撰写回答