我在调用Python方法(2.7.2)时遇到了关于#of参数的TypeError。我在网上发现的大多数类似问题都发生在人们忘记“自我”也是一个参数(sample SO question)时。或者,当有人忘记连接参数时(如here)。
我不确定这是否也是一个“自我”问题,但似乎有所不同。我基本上得到一个错误,我没有足够的论据,即使我有足够的数量。在我的追踪中:
-> 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在这种情况下?
谢谢!
所以我不知道这意味着什么,但运行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)
仍然试图加快速度,但我发现我的代码试图忽略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)
正如我在评论中所指出的那样,这与陈旧的字节码无关(虽然这听起来像我将来必须要调查的东西),但更多的编码器疏忽。我正在修改其他人的遗留代码,事实证明XMLProcessor是一种递归方法。我没有修改新参数的内部递归方法调用。因此,“8”参数错误实际上是在内部调用上触发的,而Update#2中的“10”参数错误是在外部调用上触发的。因为我在外部呼叫之前设置了我的trace(),对我来说两个错误看起来都一样 - 好像它们来自我的外部呼叫...... Gah!感谢大家的帮助 - 我需要研究我的调试技巧,并从中学到了一些有用的技巧。
正如所建议的那样,我在这里发布解决方案以使其更加明显。
TLDR
遗留方法(XMLProcessor
)是递归的,并且TypeError
在方法定义中的递归调用上被触发。我在方法之外进行追踪并没有意识到这一点。
原帖
解决了!
正如我在评论中所指出的那样,这与陈旧的字节码无关(虽然这听起来像我将来必须要调查的东西),但更多的编码器疏忽。我正在修改其他人的遗留代码,事实证明XMLProcessor是一种递归方法。我没有修改新参数的内部递归方法调用。因此,“8”参数错误实际上是在内部调用上触发的,而Update#2中的“10”参数错误是在外部调用上触发的。因为我在外部呼叫之前设置了我的trace(),对我来说两个错误看起来都一样 - 好像它们来自我的外部呼叫...... Gah!感谢大家的帮助 - 我需要研究我的调试技巧,并从中学到了一些有用的技巧。