【问题标题】:Python method giving TypeError takes exactly 9 arguments (8 given)给出 TypeError 的 Python 方法正好需要 9 个参数(给定 8 个)
【发布时间】: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


【解决方案1】:

按照建议,我在此处发布解决方案以使其更加明显。


TLDR


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


原帖


解决了!

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

【讨论】:

    猜你喜欢
    • 2015-03-09
    • 2013-07-29
    • 1970-01-01
    • 2013-04-07
    • 1970-01-01
    • 2012-03-15
    • 2014-05-06
    • 2014-05-31
    • 2016-07-16
    相关资源
    最近更新 更多