2011-01-19 10 views
6

Quiero compilar un código python usando el traductor rpython de pypy. Un ejemplo muy simple juguete que no hace nada:¿Cómo inicializar un conjunto() en el código que se compilará como el rpython de pypy?

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

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

Si compilo como:

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

no compila, más bien sólo se detiene con errores o menos así:

[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] [email protected] 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-- 

Si saco la función set(), funciona. ¿Cómo se usan los sets en rpython?

+0

Parece ser un problema con PyPy, no con su código. – orlp

+0

¿Has probado 'b = set()'? Entonces 'b.add (x)' si es necesario? – TryPyPy

+1

Entonces, parece que uno no usa conjuntos en RPython ... Los viejos dictados deberían funcionar, ¿no? – TryPyPy

Respuesta

4

Así que su oficial, set() no es compatible con rpython. Gracias TryPyPy.

+0

Aunque no entiendo por qué no se puede agregar. Si se acaba de construir encima de un dict, uno puede incluso escribir una clase myset y usarla. Aunque será mejor usar los mismos nombres que Python. – highBandWidth

0

Mientras que RPython no reconoce set, es capaz de importar el módulo Sets.

Parece que he hablado demasiado pronto. El módulo sets utiliza tres llamadas de parámetro getattr, RPython no admite el tercer parámetro opcional.

Esto se puede solucionar por:

  1. En el PyPy directorio de instalación, bajo lib-python\2.7\, copiar sets.py el directorio del proyecto, y cambiar el nombre de la copia rsets.py.
  2. Busque las cinco instancias de getattr en el archivo. Elimine el último parámetro (el valor de retorno predeterminado), que en cada caso es None.
  3. Anteponga from rsets import Set as set a su código RPython.

En cada uno de los cinco casos, si el elemento no sea hashable, se devolverá un AttributeError en lugar de un TypeError, pero por lo demás funcionará como se espera.

Cuestiones relacionadas