【发布时间】:2013-10-07 23:06:50
【问题描述】:
在调用 Python 方法 (2.7.2) 时,我遇到了关于参数 # 的 TypeError。当人们忘记“self”也是一个参数(sample SO question)时,我在网上发现的大多数类似问题都会发生。或者,当有人忘记连接参数时(例如here)。
我不确定这是否也是“自我”问题,但似乎有所不同。我基本上得到了一个错误,即我没有 enough 论点,即使我数够了。在我的追踪中:
-> message += XMLProcessor(zf, root, filepath, tag_type, display_name, containers, depth, message, username)
(Pdb) n
TypeError: 'XMLProcessor() takes exactly 9 arguments (8 given)'
现在,我已经数过很多次了,我发誓有 9 个参数。但我可能弄错了或遗漏了一些关键的东西?这个方法不是类的一部分,所以我认为“自我”不是问题……我觉得我缺少对某些东西的基本理解,但不确定是什么。
########## Function: XMLProcessor #################
# This does the work of examining the XML and traversing it.
####################################################
def XMLProcessor(zf, root, filepath, tag_type, display_name, containers, depth, message, username):
谁能解释一下为什么 9 != 9 在这种情况下?
谢谢!
更新 #1
所以我不知道这意味着什么,但运行 Martijn 在我的调试器中提供的代码:
(Pdb) import inspect, dis;
(Pdb) dis.dis(inspect.currentframe().f_code)
1 0 LOAD_NAME 0 (dis)
3 LOAD_ATTR 0 (dis)
6 LOAD_NAME 1 (inspect)
9 LOAD_ATTR 2 (currentframe)
12 CALL_FUNCTION 0
15 LOAD_ATTR 3 (f_code)
18 CALL_FUNCTION 1
21 PRINT_EXPR
22 LOAD_CONST 0 (None)
25 RETURN_VALUE
(Pdb)
更新 #2
仍在尝试加快 dis 的速度,但我发现我的代码试图完全忽略 9 个参数,这有点讽刺。在旁注中,我已经清除了我的 *.pyc 文件并重新运行我的代码......没有帮助:
(Pdb) XMLProcessor(zf, root, filepath, tag_type, display_name, containers, depth, message, username)
*** TypeError: XMLProcessor() takes exactly 9 arguments (8 given)
(Pdb) XMLProcessor(zf, root, filepath, tag_type, display_name, containers, depth, message, username, '')
*** TypeError: XMLProcessor() takes exactly 9 arguments (10 given)
解决了!
正如我在 cmets 中所指出的,这最终与陈旧的字节码无关(尽管这听起来像是我将来肯定要调查的事情),而是更多的编码器监督。我正在修改别人的遗留代码,原来 XMLProcessor 是一种递归方法。而且我没有修改新参数的内部递归方法调用。因此,“8”参数错误实际上是在内部调用时触发的,而“10”更新#2中的参数错误是在触发时触发的外部调用。因为我在外部调用之前设置了我的 trace(),所以对我来说这两个错误看起来都是一样的——就好像它们来自我的外部调用......嘎!!!!感谢大家的帮助——我需要改进我的调试技术,并从中学到了一些有用的技巧。
【问题讨论】:
-
您是否重新启动了您的流程?是否有可能加载过时的字节码?你看到的源代码不一定是 Python 运行的;字节码使用指向源代码中特定行号的指针执行,如果同时源代码更改,您将看到与实际代码不同的代码正在运行。
-
正如 Martijn Pieters 所说,字节码可能已经过时了。你的代码对我有用。
-
当您在调试器中遇到这个问题时,您可以运行
import inspect, dis; dis.dis(inspect.currentframe().f_code)并将输出粘贴到这里吗?这将显示正在运行的实际字节码,作为反汇编。 -
其他人也可以确认给定的代码有效吗?我只是将
None作为所有参数值传递...请确认某人? -
结果证明这是我的一个非常愚蠢的错误,与参数类型无关。我正在修改遗留代码,而 XMLProcessor 是一个递归函数——我错过了更新方法内部的递归方法调用。所以最初的“8”错误是在内部调用中,但我在更新#2 中发布的“10”错误是在外部调用中。由于我的跟踪在方法之外运行,对我来说这两个错误看起来都一样!愚蠢...我将在此基础上在我的工具包中添加一些调试技巧。谢谢大家!
标签: python methods arguments typeerror trace