2011-01-19 23 views
6

Tôi muốn biên dịch một số mã python sử dụng trình biên dịch rpython của Pypy. Một ví dụ đồ chơi rất đơn giản mà không làm bất cứ điều gì:Làm thế nào để khởi tạo một tập hợp() trong mã được biên dịch như rpython của pypy?

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

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

Nếu tôi biên dịch nó như:

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

Nó không biên dịch, chứ không phải chỉ dừng với lỗi cái gì đó như thế này:

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

Nếu tôi lấy hàm set() hoạt động. Làm thế nào để bạn sử dụng bộ trong rpython?

+0

Dường như là sự cố với PyPy chứ không phải mã của bạn. – orlp

+0

Bạn đã thử 'b = set()' chưa? Sau đó, 'b.add (x)' nếu cần? – TryPyPy

+1

Vì vậy, có vẻ như một trong những không sử dụng bộ trong RPython ... Tốt dicts cũ nên làm các trick, phải không? – TryPyPy

Trả lời

4

Vì vậy, chính thức của nó, set() không được hỗ trợ trong rpython. Cảm ơn TryPyPy.

+0

Mặc dù tôi không hiểu tại sao nó không thể được thêm vào. Nếu nó chỉ được xây dựng trên đầu trang của một dict, người ta thậm chí có thể viết một lớp học myset và sử dụng nó. Mặc dù sẽ tốt hơn nếu sử dụng cùng tên với python. – highBandWidth

0

Trong khi RPython không nhận dạng set, nó có khả năng nhập mô-đun Sets.

Tôi dường như đã nói quá sớm. Mô-đun sets sử dụng ba tham số getattr cuộc gọi, RPython không hỗ trợ paramemter thứ ba tùy chọn.

này có thể được cố định bởi:

  1. Trong PyPy thư mục cài đặt, dưới lib-python\2.7\, sao chép sets.py vào thư mục dự án của bạn, và đổi tên bản sao rsets.py.
  2. Tìm kiếm năm phiên bản getattr trong tệp. Loại bỏ tham số cuối cùng (giá trị trả về mặc định), trong mỗi trường hợp None.
  3. Đăng ký from rsets import Set as set vào mã RPython của bạn.

Trong mỗi năm trường hợp, phần tử không được băm, nó sẽ trả về AttributeError thay vì TypeError, nhưng sẽ hoạt động như mong đợi.

Các vấn đề liên quan