我想使用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中使用集合?
答案 0 :(得分:4)
因此rpython不支持其官方的set()。谢谢TryPyPy。
答案 1 :(得分:0)
虽然RPython无法识别 set
,但它能够导入Sets
模块。
我似乎有点说得太早了。 sets
模块使用三个参数getattr
调用,RPython不支持可选的第三个参数。
这可以通过以下方式解决:
lib-python\2.7\
下,将sets.py
复制到项目目录,然后重命名副本rsets.py
。getattr
的五个实例。删除最后一个参数(默认返回值),在每种情况下None
。from rsets import Set as set
添加到您的RPython代码中。在五个实例中的每个实例中,如果元素不可清除,它将返回AttributeError
而不是TypeError
,但否则将按预期工作。