Как инициализировать set () в коде, который будет скомпилирован как pypy's rpython? - PullRequest
6 голосов
/ 20 января 2011

Я хочу скомпилировать некоторый код на Python с помощью Pypy-переводчика rpython.Очень простой игрушечный пример, который ничего не делает:

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 ]

4 голосов
/ 20 января 2011

Так что его официальный set () не поддерживается в rpython.Спасибо TryPyPy.

0 голосов
/ 11 апреля 2014

Хотя 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.

В каждом из пяти экземпляров, если элемент не может быть хэшируемым, он будет возвращать AttributeError, а не TypeError, но в противном случае будет работать как положено.

...