2011-01-19 5 views
6

Chcę skompilować trochę kodu Pythona za pomocą tłumacza pypy rpython. Bardzo prosty przykład zabawka, która nic nie robi:Jak zainicjować zestaw() w kodzie, który ma być skompilowany jako rpython pypy?

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

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

Gdybym go skompilować jak:

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

To nie kompiluje, raczej po prostu zatrzymuje się z błędami coś takiego:

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

Jeśli wyjmę funkcję set(), to działa. W jaki sposób używasz zestawów w rpythonie?

+0

Wydaje się być problemem z PyPy, a nie kodem. – orlp

+0

Czy próbowałeś 'b = set()'? Następnie "b.add (x)" w razie potrzeby? – TryPyPy

+1

Wygląda na to, że nie używamy zestawów w RPython ... Dobre stare dyktury powinny załatwić sprawę, prawda? – TryPyPy

Odpowiedz

4

Tak więc oficjalny, set() nie jest obsługiwany w rpython. Dzięki TryPyPy.

+0

Chociaż nie rozumiem, dlaczego nie można go dodać. Jeśli jest zbudowany na szczycie dyktatury, można nawet napisać klasę myset i użyć jej. Chociaż lepiej będzie używać tych samych nazw co Python. – highBandWidth

0

Podczas gdy RPython nie rozpoznaje set, jest w stanie importować moduł Sets.

Wydaje mi się, że rozmawiałem zbyt szybko. Moduł sets wykorzystuje trzy wywołania parametru getattr, a RPython nie obsługuje opcjonalnego trzeciego parametru.

ten może być ustalony przez:

  1. W pypy katalogu instalacyjnym, pod lib-python\2.7\, skopiuj sets.py do katalogu projektu i zmienić nazwę kopii rsets.py.
  2. Wyszukaj pięć instancji getattr w pliku. Usuń ostatni parametr (domyślną wartość zwracaną), który w każdym przypadku wynosi None.
  3. Przygotuj from rsets import Set as set do swojego kodu RPython.

We wszystkich pięciu przypadkach, element nie powinien być hashable będzie zwracać AttributeError zamiast TypeError, ale w inny sposób działać prawidłowo.

Powiązane problemy