0

在调用 Python 方法(2.7.2)时,我遇到了关于参数 # 的 TypeError。当人们忘记“自我”也是一个参数时,我在网上发现的大多数类似问题都会发生(示例 SO 问题)。或者,当有人忘记连接参数时(比如这里)。

我不确定这是否也是一个“自我”问题,但似乎有所不同。我基本上得到了一个错误,即我没有足够的论据,即使我数够了。在我的跟踪中:

-> 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)

解决了!

正如我在评论中指出的那样,这最终与陈旧的字节码无关(尽管这听起来像是我将来肯定要调查的事情),而是更多的编码监督。我正在修改别人的遗留代码,结果发现 XMLProcessor 是一种递归方法。而且我没有修改新参数的内部递归方法调用。因此,“8”参数错误实际上是在内部调用时触发的,而“更新 #2”中的“10”参数错误是在外部调用时触发的。因为我在外部调用之前设置了我的 trace(),所以对我来说这两个错误看起来都是一样的——就好像它们来自我的外部调用......嘎!!!!感谢大家的帮助——我需要研究我的调试技术,我从中学到了一些有用的技巧。

4

1 回答 1

0

如建议的那样,我在此处发布解决方案以使其更加明显。


TLDR


旧方法 ( XMLProcessor) 是递归的,并且TypeError在方法定义中的递归调用上被触发。我在该方法之外进行追踪,但没有意识到这一点。


原帖


解决了!

正如我在评论中指出的那样,这最终与陈旧的字节码无关(尽管这听起来像是我将来肯定要调查的事情),而是更多的编码监督。我正在修改别人的遗留代码,结果发现 XMLProcessor 是一种递归方法。而且我没有修改新参数的内部递归方法调用。因此,“8”参数错误实际上是在内部调用时触发的,而“更新 #2”中的“10”参数错误是在外部调用时触发的。因为我在外部调用之前设置了我的 trace(),所以对我来说这两个错误看起来都是一样的——就好像它们来自我的外部调用......嘎!!!!感谢大家的帮助——我需要研究我的调试技术,我从中学到了一些有用的技巧。

于 2018-09-10T12:28:35.590 回答