2009-05-31 9 views
0

編集:あなたがここに完全なソースを取得することができます: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 
+0

今これをスキム以上を行うには疲れている。あなたは解決しようとしている問題をより明確に述べている冒頭の段落を追加したいかもしれません。私はfizzBat関数から "XYZ"の出力を得ています。私は "ABC"の出力を得たいと思っています。私はあなたがそこにそのほとんどを持っていると思うが、すぐには分かりません。問題を明確にし、検討する必要があるソースコードの範囲を狭めることができれば、より多くの助けを得ることができます。誰もあなたのためにこれを解決していない場合、私は戻って、私はいくつかの睡眠をした後にもっと役立つようにすることができます... –

+0

私はさらに追加しようとしましたが、私はカバーするために何かを考えることはできません。もし私がもっと考えるなら、私はそれを追加します。 – Scott

+0

ここにすべてのコードをhttp://pastebin.com/に入れて、上にリンクを貼ってみてください。 –

答えて

2

あなたのコードが切り捨てられたことが表示されますので、私はそれに目を通すことはできません。

あなただけのクラスで定義されたメソッドの追加の引数を取得することを考えると、しかし、それはself変数であるかもしれませんか?Pythonクラスのすべてのメソッドは、最初のパラメータとしてselfを受け取り、それを考慮しなければ、間違ったものになります。言い換えれば

、この必要があります。

def foo(result, *argv): 
    print argv[0] 

は実際にこのこと:その場合は

def foo(self, result, *argv): 
    print argv[0] 

、その後、伝統的にselfが保持する値がresultに割り当てられます、そして、あなたの結果値になりますargvの最初の位置にある。

そうでない場合は、より多くのコードを提供する必要があります。少なくとも、実際にテストを実行するコード。 Fooクラスで

+0

OK関連コードで更新しました。 – Scott

+0

私はあなたの答えについていくつか考えました。その場合、RESULTおよびRESULTではなく、EvaluatorおよびRESULTのインスタンスのインスタンスが表示されます。私は同意しますが、インスタンスメソッドを使って作業しているときにだけバグが発生するという事実は、それが自己と関係するかもしれないことを示唆しています。私はそれを見つけることができません。 – Scott

+0

私はあなたの言葉のいくつかを誤解しました。私は今理解し、あなたは正しい。 – Scott

1

、あなたが


    def __init__(self, visitor): 
     visitor.AddFunction("foo", -1, self.foo) 

を呼び出すとき...あなたは "バウンド" メソッドの引数(つまり、self.fooである)と呼ばれるものを追加しています。すでにself引数が指定されている関数のようなものです。その理由は、self.foo(bar、baz)を呼び出すときに、引数リストに "self"を指定していないからです。お電話の場合


    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 
+0

"さらに、EvalTreeは関数に最初の引数として自身の自己を渡します。" - それが私の問題だった。私はWoWを演奏している間にルアですべてを渡す習慣を覚えていて、そこに自分を入力しました。最初の議論として自己を過ぎてはならない。そんなこと知ってる。私はそれを見ていないとは信じられません。いずれにしても、現在は機能しています。それを見ていただきありがとうございます。 – Scott

関連する問題