隐藏参数在哪里?
我这里有一个函数调用:
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 个回答
还有一个想法:你可能不小心调用了旧版本的代码。确保你的文件夹里没有多余的 .pyc 文件。
你粘贴的代码片段看起来没问题。正如其他人所说的,要找到问题所在,你需要找出最小的代码量,这部分代码仍然有错误。
我的建议是:
(1) 检查一下模块 test_hosts
是否是为你当前的 Python 版本编写的,并且确认确实是这个文件被导入了。
(2) 把 class LocalTestHost: def __init__((...
这个函数复制到你的文件里,然后试着从那里调用它。如果参数数量对了,它会抛出类似 NameError 的错误。
(3) 如果上面的函数对你有效,检查一下 test_hosts.LocalTestHost.__init__()
的签名,看看运行时的情况。可能有人在某个地方通过 __init__ = staticmethod(__init__)
这种方式改变了它(这是一种旧的定义静态函数的方法)。
请告诉我们结果如何!
天哪,我真是个傻瓜。我需要更仔细地阅读错误信息。
其实导致问题的代码并不在这里,而是在构造函数里面的几行代码。这里就是:
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(理智检查),结果发现确实是我关注的那个构造函数出问题了。让我惊讶的是,在这种情况下,错误信息的追踪确实短了很多。
今天我学到了一个宝贵的教训。问题是,我觉得我已经学过好几次了,这些年里。