編集:あなたがここに完全なソースを取得することができます:http://pastebin.com/m26693デバッグいくつかのPythonコード
編集再び:私はペーストビンページにいくつかのハイライトを追加しました。 http://pastebin.com/m10f8d239
私は多分このような長い質問を後悔するつもりですが、私はこのバグに困惑しています。このコードを実行する必要があります(編集:もはや、すべてのコードを含めることはできませんでした - 切り詰められていました)それを実行せずにそれを把握してください。実際に私はそれが必要ではないので十分に説明することができ、私がそれを達成しなければ謝罪することを希望します。
最初に出力します。 (編集:新しい出力があります)
argc 1 [<__main__.RESULT instance at 0x94f91ec>]
(<__main__.RESULT instance at 0x9371f8c>, <__main__.RESULT instance at 0x94f91ec>)
None
bar
internal error: unknown result type 0
argc 1 [<__main__.RESULT instance at 0x94f92ac>]
(<__main__.RESULT instance at 0x94f91ac>, <__main__.RESULT instance at 0x94f92ac>)
None
bar
internal error: unknown result type 0
argc 1 [<__main__.RESULT instance at 0x94f91ec>]
(<__main__.RESULT instance at 0x94f91ec>,)
String: 'bar'
出力には3つのディビジョンがあります。 argcは常に1であることに注意してください。それが表示されているところでは、引数リストがプラグインに渡されるように構築されています(プラグインは式インタプリタの単純なコマンドです。 argcに続く単一のRESULTインスタンス表現が引数リストです。次の行は、呼び出されるPythonメソッドに到達すると引数リストです。ここには2つの引数があることに注意してください。これらのうちの最初の2つはごみです。もう一つは私が望むものです。しかし、 "argc 1"を始める行で見ることができるように、引数リストは常に1 RESULTです。迷いの議論はどこから来ていますか?
私が言ったように、出力には3つの区分があります。最初の部門はそれ自身でクラスです。 2番目の除算はサブクラス化されたクラスです。 3番目の部門はクラス/インスタンスではありません。私が期待したものを出力する唯一の部門は第3です。呼び出しの前と呼び出しの両方に1つの引数メンバーがあり、最後の行が目的の出力であることに注意してください。引数 "bar"をエコー/返すだけです。
私が知っておく必要がある可変引数リストには何らかの特質がありますか?私は何を意味することは、次のとおりです。
def foo(result, *argv):
print argv[0]
私は本当にゴミがから来ているようだ場所なのでバグは、これとは何かを持っていると思います - コールと方法で実行到着の間で。
編集:オクラホマので、彼らはこれらの質問の大きさを制限します。 :)私は何が起こっているかを示すために最善を尽くします。ここにEvalTreeの関連部分があります。このコードには2つの部門しかないことに注意してください。私は他のファイルを台無しにして削除しました。
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
今これをスキム以上を行うには疲れている。あなたは解決しようとしている問題をより明確に述べている冒頭の段落を追加したいかもしれません。私はfizzBat関数から "XYZ"の出力を得ています。私は "ABC"の出力を得たいと思っています。私はあなたがそこにそのほとんどを持っていると思うが、すぐには分かりません。問題を明確にし、検討する必要があるソースコードの範囲を狭めることができれば、より多くの助けを得ることができます。誰もあなたのためにこれを解決していない場合、私は戻って、私はいくつかの睡眠をした後にもっと役立つようにすることができます... –
私はさらに追加しようとしましたが、私はカバーするために何かを考えることはできません。もし私がもっと考えるなら、私はそれを追加します。 – Scott
ここにすべてのコードをhttp://pastebin.com/に入れて、上にリンクを貼ってみてください。 –