以下是我的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
对象非常奇怪。
有谁碰巧知道为什么?
答案 0 :(得分:0)
这个答案来自Jim Baker的mailing list:
问题出在
行final PySet set = new PySet(PyString.TYPE);
我认为你试图使用它就好像它是PySet set = new PySet(),但实际上它意味着Python代码中结果对象的类型应该是PyString。这正是你观察到的!
(为什么会这样?我们在Jython中有两个对象模型:Python和Java,我们必须在运行时结合支持。这样做可能有点棘手!)
解决方案非常简单:将初始化更改为
final PySet set = new PySet()