调试一些Python代码
编辑:您可以在此处获取完整的源代码: 再次编辑:我在pastebin页面添加了一些亮点 我可能会后悔问这么长的问题,但我被这个错误难住了,我需要一些指导。你必须运行这段代码(编辑:不再。我不能包含所有的代码——它被截断了)来帮助你真正了解发生了什么,除非你是上帝或什么的,然后不用运行它就想方设法找出它。事实上,我希望我能解释得足够好,这样就没有必要了,如果我没有做到这一点,我真的很抱歉 首先,我将给您一些输出。(编辑:下面有新的输出) 我真的认为bug与此有关,因为垃圾似乎来自于此——在方法中的调用和执行到达之间 编辑:好的,所以他们限制了这些问题的大小。:)我会尽我最大的努力展示发生了什么。下面是EvalTree的相关部分。请注意,此代码中只有2个分区。我把另一个文件搞砸了,把它删除了调试一些Python代码,python,debugging,Python,Debugging,编辑:您可以在此处获取完整的源代码: 再次编辑:我在pastebin页面添加了一些亮点 我可能会后悔问这么长的问题,但我被这个错误难住了,我需要一些指导。你必须运行这段代码(编辑:不再。我不能包含所有的代码——它被截断了)来帮助你真正了解发生了什么,除非你是上帝或什么的,然后不用运行它就想方设法找出它。事实上,我希望我能解释得足够好,这样就没有必要了,如果我没有做到这一点,我真的很抱歉 首先,我将给您一些输出。(编辑:下面有新的输出) 我真的认为bug与此有关,因为垃圾似乎来自于此——在方法中的
def EvalTree(self, Root):
type = -1
number = 0.0
freeme = 0
if Root.Token == T_NUMBER or Root.Token == T_STRING:
return 0
elif Root.Token == T_VARIABLE:
self.CopyResult(Root.Result, Root.Variable.value)
return 0
elif Root.Token == T_FUNCTION:
argc = Root.Children
param = resizeList([], argc, RESULT)
print "argc", argc
for i in range(argc):
self.EvalTree(Root.Child[i])
param[i] = Root.Child[i].Result
self.DelResult(Root.Result)
Root.Function.func(Root.Result, *param) # I should have never ever programmed Lua ever.
return 0
这是插件的类
class Foo:
def __init__(self, visitor):
visitor.AddFunction("foo", -1, self.foo)
def foo(self, result, *argv):
print argv
这里是执行的地方
if __name__ == "__main__":
evaluator = Evaluator()
expression = "foo2('bar')"
#expression = "uptime('test')"
evaluator.SetVariableString("test", "Foo")
def func(self, result, *arg1):
print arg1
evaluator.SetResult(result, R_STRING, evaluator.R2S(arg1[0]))
evaluator.AddFunction('foo2', -1, func)
result = RESULT(0, 0, 0, None)
tree = evaluator.Compile(expression)
if tree != -1:
evaluator.Eval(tree, result)
if result.type == R_NUMBER:
print "Number: %g" % (evaluator.R2N(result))
elif result.type == R_STRING:
print "String: '%s'" % (result.string) #(evaluator.R2S(result))
elif result.type == (R_NUMBER | R_STRING):
print "String: '%s' Number: (%g)" % (evaluator.R2S(result), evaluator.R2N(result))
else:
print "internal error: unknown result type %d" % (result.type)
expression = "foo('test')"
result = RESULT(0, 0, 0, None)
tree = evaluator.Compile(expression)
if tree != -1:
evaluator.Eval(tree, result)
if result.type == R_NUMBER:
print "Number: %g" % (evaluator.R2N(result))
elif result.type == R_STRING:
print "String: '%s'" % (result.string) #(evaluator.R2S(result))
elif result.type == (R_NUMBER | R_STRING):
print "String: '%s' Number: (%g)" % (evaluator.R2S(result), evaluator.R2N(result))
else:
print "internal error: unknown result type %d" % (result.type)
这是新的输出:
argc 1
(<__main__.RESULT instance at 0x9ffcf4c>,)
String: 'bar'
argc 1
(<__main__.RESULT instance at 0xa0030cc>, <__main__.RESULT instance at 0xa0030ec>)
internal error: unknown result type 0
argc 1
(,)
字符串:“bar”
argc1
(, )
内部错误:未知的结果类型0
您的代码似乎已被截断,因此我无法查看
但是,如果您只获得类中定义的方法的额外参数,那么它可能是self
变量吗?Python类上的每个方法都接收self
作为第一个参数,如果不考虑它,就会出错
换言之,如果:
def foo(result, *argv):
print argv[0]
实际上是这样的:
def foo(self, result, *argv):
print argv[0]
如果是这样,则传统上由self
持有的值将分配给result
,并且您的结果值将位于argv的第一个位置
如果不是这样,您需要提供更多的代码。至少是实际运行测试的代码。看来您的代码被截断了,所以我无法查看它 但是,如果您只获得类中定义的方法的额外参数,那么它可能是
self
变量吗?Python类上的每个方法都接收self
作为第一个参数,如果不考虑它,就会出错
换言之,如果:
def foo(result, *argv):
print argv[0]
实际上是这样的:
def foo(self, result, *argv):
print argv[0]
如果是这样,则传统上由self
持有的值将分配给result
,并且您的结果值将位于argv的第一个位置
如果不是这样,您需要提供更多的代码。至少,实际运行测试的代码。在类Foo中,当您调用
def __init__(self, visitor):
visitor.AddFunction("foo", -1, self.foo)
def __init__(self, visitor):
visitor.AddFunction("foo", -1, Foo.foo)
…您正在添加所谓的“绑定”方法参数(即,self.foo
)。它就像一个已经指定了自参数的函数。原因是,当您调用self.foo(bar,baz)时,不会在参数列表中再次指定“self”。如果你打电话
def __init__(self, visitor):
visitor.AddFunction("foo", -1, self.foo)
def __init__(self, visitor):
visitor.AddFunction("foo", -1, Foo.foo)
…您将获得与自由函数相同的结果。然而,我不认为这是你想要的。此外,EvalTree将自己的
self
作为第一个参数传递给函数。我认为您可能需要这样声明foo:
class Foo:
def __init__(self, visitor):
visitor.AddFunction("foo", -1, self.foo)
def foo(self, tree, result, *argv):
print argv
在课堂上,当你打电话
def __init__(self, visitor):
visitor.AddFunction("foo", -1, self.foo)
def __init__(self, visitor):
visitor.AddFunction("foo", -1, Foo.foo)
…您正在添加所谓的“绑定”方法参数(即,self.foo
)。它就像一个已经指定了自参数的函数。原因是,当您调用self.foo(bar,baz)时,不会在参数列表中再次指定“self”。如果你打电话
def __init__(self, visitor):
visitor.AddFunction("foo", -1, self.foo)
def __init__(self, visitor):
visitor.AddFunction("foo", -1, Foo.foo)
…您将获得与自由函数相同的结果。然而,我不认为这是你想要的。此外,EvalTree将自己的
self
作为第一个参数传递给函数。我认为您可能需要这样声明foo:
class Foo:
def __init__(self, visitor):
visitor.AddFunction("foo", -1, self.foo)
def foo(self, tree, result, *argv):
print argv
我现在太累了,除了略读这篇文章之外,什么都做不了。您可能希望在介绍性段落中添加一段内容,以便更清楚地说明您试图解决的问题。例如:我从fizzBat函数中得到一个“XYZ”的输出,我想得到一个“ABC”的输出。我想你已经知道了其中的大部分,但这并不是很明显。如果您能够澄清问题并缩小我们需要检查的源代码的范围,您可能会得到更多帮助。如果没有其他人帮你解决这个问题,我可能会在睡了一觉后回来,试着提供更多帮助……我试图补充更多,但我想不出还有什么可以弥补的。如果我想的更多,我会添加它。你为什么不把所有的代码放在这里,并在上面贴一个链接。好主意。完成。这是问题的关键。-1:太长,太混乱,无法集中注意力。有没有办法在不提供大量无关代码和输出的情况下专注于一个特定的问题?好的软件是由许多小部件组合而成的。也许重构你所拥有的东西会让你得到更好的设计和更简单的问题。我现在太累了,不能做更多的事情了。您可能希望在介绍性段落中添加一段内容,以便更清楚地说明您试图解决的问题。例如:我从fizzBat函数中得到一个“XYZ”的输出,我想得到一个“ABC”的输出。我想你已经知道了其中的大部分,但这并不是很明显。如果您能够澄清问题并缩小我们需要检查的源代码的范围,您可能会得到更多帮助。如果没有其他人帮你解决这个问题,我可能会在睡了一觉后回来,试着提供更多帮助……我试图补充更多,但我想不出还有什么可以弥补的。如果我想的更多,我会添加它。你为什么不把所有的代码放在这里,并在上面贴一个链接。好主意。完成。这是问题的关键。-1:太长,太混乱,无法集中注意力。有没有办法在不提供大量无关代码和输出的情况下专注于一个特定的问题?好的软件是由许多小部件组合而成的。也许重构你所拥有的东西会让你得到更好的设计和更简单的问题