0

以下は私のJavaコードです:

public void testPySet() {
    final PythonInterpreter interpreter = new PythonInterpreter();
    final String userCode = "def test(x):\n\tprint(x)\n\tx.add(\"d\")\n\treturn x";
    interpreter.exec(userCode);
    final PyObject method = interpreter.get("test");
    final PySet set = new PySet(PyString.TYPE);
    set.add("a");
    set.add("b");
    set.add("c");
    final PyObject result = method.__call__(set);
    System.out.println(result);
}

実行すると、次のエラー メッセージが表示されます。

Traceback (most recent call last):
  File "<string>", line 3, in test
AttributeError: 'str' object has no attribute 'add'

)を削除すると、x.add(\"d\"正常に実行されます。

PySetオブジェクトがオブジェクトとして認識されるのは非常に奇妙ですstr

誰かがたまたま理由を知っていますか?

4

1 に答える 1

0

この回答は、メーリング リストの Jim Baker からのものです。

問題はラインにあります

final PySet set = new PySet(PyString.TYPE);

これを PySet set = new PySet() であるかのように使用しようとしていると思いますが、実際には、Python コードで結果として得られるオブジェクトの型は PyString でなければならないことを意味します。これはまさにあなたが観察するものです!

(なぜそうなのか? Jython には Python と Java の 2 つのオブジェクト モデルがあり、ランタイムでサポートを組み合わせる必要があります。これを行うには少し注意が必要です!)

解決策は非常に簡単です。初期化を次のように変更します。

final PySet set = new PySet()
于 2015-06-17T17:09:15.343 に答える