`PySet`对象被识别为`str`对象

时间:2015-05-09 14:01:17

标签: jython jython-2.7

以下是我的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对象非常奇怪。

有谁碰巧知道为什么?

1 个答案:

答案 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()