2

Jython 2.5.1 を JSR-223 (つまり、javax.script パッケージ) で使用しており、Python スクリプトの最後の行が返されることを期待しています。たとえば、このスクリプトを評価した後:

class Multiplier:

  def multiply(self, x, y):
    return x * y

Multiplier().multiply(5, 7)

35 を返す必要がありますが、代わりに null が返されます。一方、それはこの他のテストで動作します:

5 * 7

私は何を間違っていますか?

Javaコードは次のとおりです。

public static void main(String[] args) throws Exception {
    ScriptEngine engine = new ScriptEngineManager().getEngineByName("python");

    FileReader f = new FileReader("Multiplier.py");
    Object result = engine.eval(f);
    //assert(result == 35);
}

PS: JRuby、Groovy、Rhino で問題なく動作します。つまり、常に最後の行が返されます。

前もって感謝します。

4

3 に答える 3

4

これは、Jython や JSR 223 の問題というよりも、Python 言語の問題です。Python は、式 (値を持つ) とステートメント (値を持たない) を区別します。渡すスクリプトはステートメントです。式を渡した場合、値があります。

Ruby と JavaScript で異なる点が見られるのは、複合ステートメントが最後に評価されたステートメントの値を持つためです。たとえば、Ruby を比較します。

>> (2 ; 3) + 5
=> 8
>> (x = 5) + 7
=> 12

Python で:

>>> (2 ; 3) + 5
  File "<stdin>", line 1
    (2 ; 3) + 5
       ^
SyntaxError: invalid syntax
>>> (x = 5) + 7
  File "<stdin>", line 1
    (x = 5) + 7
       ^
SyntaxError: invalid syntax

JavaScript はその中間のようです。Ruby と同様に、割り当ては割り当てられた値に評価されます。ただし、ブロック内の最後に評価されたステートメントが返されますが、式の一部としては使用できません。

> { 2 ; 3 }
3
> { 2 ; 3 } + 5
5
> (x = 5) + 7
12
于 2009-12-15T23:38:45.800 に答える
3

更新:コメントで明確化された最初の回答で、OPの目標(および問題)を実際に見逃していました。それに応じて回答を更新しています。

まず、スクリプトを次のように更新しMultiplier.pyます。

class Multiplier:

  def multiply(self, x, y):
    return x * y

x = Multiplier().multiply(5, 7)

次に、Java コードから次のように呼び出します。

public static void main(String[] args) throws Exception {
    ScriptEngine engine = new ScriptEngineManager().getEngineByName("python");

    FileReader f = new FileReader("Multiplier.py");
    engine.eval(f);
    Object x = engine.get("x");
    System.out.println("x: " + x);
}

上記のコードを実行すると、次の出力が得られます。

x: 35
于 2009-12-11T12:44:26.627 に答える
2

私も同じ問題を抱えていました。JSR223 をサポートするスクリプト ライブラリを作成し、http : //bugs.jython.org/issue1798 に提出しました。

$ python
Python 2.6.6 (r266:84292, Sep 15 2010, 16:22:56) 
[GCC 4.4.5] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> x=5<br/>
>>> x<br/>
5
>>>

少なくともeval("x=5\nx")、価値を取り戻すと思われる場合。

于 2011-10-04T22:34:36.163 に答える