2011-01-19 5 views
6

Voglio compilare un codice Python usando il traduttore rpython di pypy. Un giocattolo semplice esempio che non fa nulla:Come inizializzare un set() nel codice per essere compilato come rpython di pypy?

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

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

Se compilo come:

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

non si compila, piuttosto appena si ferma con gli errori di qualcosa di simile:

[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-- 

Se tolgo la funzione set(), funziona. Come usi gli insiemi in rpython?

+0

Sembra essere un problema con PyPy, non il tuo codice. – orlp

+0

Hai provato 'b = set()'? Quindi 'b.add (x)' se necessario? – TryPyPy

+1

Quindi, sembra che uno non usi gli insiemi in RPython ... Buone vecchie dicts dovrebbero fare il trucco, giusto? – TryPyPy

risposta

4

Quindi la sua versione ufficiale, set() non è supportata in rpython. Grazie TryPyPy.

+0

Anche se non capisco perché non può essere aggiunto. Se è appena costruito su un ditt, si può anche scrivere una classe myset e usarla. Anche se sarà meglio usare gli stessi nomi di Python. – highBandWidth

0

Mentre RPython non riconosce set è in grado di importare il modulo Sets.

Mi sembra di aver parlato un po 'troppo presto. Il modulo sets utilizza tre parametri chiamate getattr, RPython non supporta il terzo parametro opzionale.

Questo può essere risolto da:

  1. Nel PyPy directory di installazione, sotto lib-python\2.7\, copiare sets.py alla directory del progetto, e rinominare la copia rsets.py.
  2. Cerca le cinque istanze di getattr nel file. Rimuovere l'ultimo parametro (il valore di ritorno predefinito), che è in ogni caso None.
  3. Prependa from rsets import Set as set al codice RPython.

In ciascuno dei cinque casi, dovrebbe essere l'elemento non hashable, si restituirà un AttributeError piuttosto che un TypeError, ma sarà comunque funzionare come previsto.