如何在代码中初始化set()以编译为pypy的rpython?

时间:2011-01-19 21:37:29

标签: python compilation set pypy

我想使用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中使用集合?

2 个答案:

答案 0 :(得分:4)

因此rpython不支持其官方的set()。谢谢TryPyPy。

答案 1 :(得分: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添加到您的RP​​ython代码中。
  4. 在五个实例中的每个实例中,如果元素不可清除,它将返回AttributeError而不是TypeError,但否则将按预期工作。