6

我想使用 pypy 的 rpython 翻译器编译一些 python 代码。一个不做任何事情的非常简单的玩具示例:

def main(argv):
 a = []
 b = set(a)
 print b
 return 0

def target(driver,args):
        return main,None

如果我将其编译为:

python2.6 ~/Downloads/pypy-1.4.1-src/pypy/translator/goal/translate.py --output trypy trypy.py 

它不会编译,而只是因出现以下错误而停止:

[translation:ERROR]  AttributeError': 'FrozenDesc' object has no attribute 'rowkey'
[translation:ERROR]  .. v1 = simple_call((type set), v0)
[translation:ERROR]  .. '(trypy:3)main'
[translation:ERROR] Processing block:
[translation:ERROR]  block@0 is a <class 'pypy.objspace.flow.flowcontext.SpamBlock'>
[translation:ERROR]  in (trypy:3)main
[translation:ERROR]  containing the following operations:
[translation:ERROR]        v0 = newlist()
[translation:ERROR]        v1 = simple_call((type set), v0)
[translation:ERROR]        v2 = str(v1)
[translation:ERROR]        v3 = simple_call((function rpython_print_item), v2)
[translation:ERROR]        v4 = simple_call((function rpython_print_newline))
[translation:ERROR]  --end--

如果我取出 set() 函数,它就可以工作。你如何在 rpython 中使用集合?

4

2 回答 2

4

所以它的官方 set() 在 rpython 中不受支持。感谢 TryPyPy。

于 2011-01-19T23:01:30.700 回答
0

虽然 RPython 无法识别set它能够导入Sets模块。

我好像说的有点太早了。该sets模块使用三个参数getattr调用,RPython 不支持可选的第三个参数。

这可以通过以下方式解决:

  1. 在 pypy 安装目录下lib-python\2.7\,复制sets.py到您的项目目录,并将副本重命名为rsets.py.
  2. 搜索getattr文件中的五个实例。删除最后一个参数(默认返回值),在每种情况下都是None.
  3. 预先from rsets import Set as set添加到您的 RPython 代码中。

在这五个实例中,如果元素不是可散列的,它将返回 aAttributeError而不是 a TypeError,但会按预期工作。

于 2014-04-11T09:32:27.720 回答