Mô tả dự án
Một công cụ trang trí chức năng để sử dụng goto
trong Python. Được thử nghiệm trên Python 2.6 đến 3.6 và Pypy.
Cài đặt
pip install goto-statement
Cách sử dụng
from goto import with_goto @with_goto def range[start, stop]: i = start result = [] label .begin if i == stop: goto .end result.append[i] i += 1 goto .begin label .end return result
Thực hiện
Lưu ý rằng label .begin
và goto .begin
là cú pháp Python thường xuyên để truy xuất thuộc tính begin
từ các đối tượng có tên biến label
và goto
. Tuy nhiên, trong ví dụ trên các biến này không được xác định. Vì vậy, mã này thường sẽ gây ra
from goto import with_goto @with_goto def range[start, stop]: i = start result = [] label .begin if i == stop: goto .end result.append[i] i += 1 goto .begin label .end return result0. Nhưng vì cú pháp hợp lệ, hàm có thể được phân tích cú pháp và kết quả là sau bytecode:
2 0 LOAD_FAST 0 [start]
3 STORE_FAST 2 [i]
3 6 BUILD_LIST 0
9 STORE_FAST 3 [result]
5 12 LOAD_GLOBAL 0 [label]
15 LOAD_ATTR 1 [begin]
18 POP_TOP
6 19 LOAD_FAST 2 [i]
22 LOAD_FAST 1 [stop]
25 COMPARE_OP 2 [==]
28 POP_JUMP_IF_FALSE 41
7 31 LOAD_GLOBAL 2 [goto]
34 LOAD_ATTR 3 [end]
37 POP_TOP
38 JUMP_FORWARD 0 [to 41]
9 >> 41 LOAD_FAST 3 [result]
44 LOAD_ATTR 4 [append]
47 LOAD_FAST 2 [i]
50 CALL_FUNCTION 1
53 POP_TOP
10 54 LOAD_FAST 2 [i]
57 LOAD_CONST 1 [1]
60 INPLACE_ADD
61 STORE_FAST 2 [i]
11 64 LOAD_GLOBAL 2 [goto]
67 LOAD_ATTR 1 [begin]
70 POP_TOP
13 71 LOAD_GLOBAL 0 [label]
74 LOAD_ATTR 3 [end]
77 POP_TOP
14 78 LOAD_FAST 3 [result]
81 RETURN_VALUE
Trình trang trí
from goto import with_goto @with_goto def range[start, stop]: i = start result = [] label .begin if i == stop: goto .end result.append[i] i += 1 goto .begin label .end return result1 sau đó loại bỏ mã byte tương ứng đã được tạo cho các biến số thuộc tính của các biến
label
và goto
và đưa ra lệnh from goto import with_goto @with_goto def range[start, stop]: i = start result = [] label .begin if i == stop: goto .end result.append[i] i += 1 goto .begin label .end return result4 cho mỗi
goto
: 2 0 LOAD_FAST 0 [start]
3 STORE_FAST 2 [i]
3 6 BUILD_LIST 0
9 STORE_FAST 3 [result]
5 12 NOP
13 NOP
14 NOP
15 NOP
16 NOP
17 NOP
18 NOP
6 >> 19 LOAD_FAST 2 [i]
22 LOAD_FAST 1 [stop]
25 COMPARE_OP 2 [==]
28 POP_JUMP_IF_FALSE 41
7 31 JUMP_ABSOLUTE 78
34 NOP
35 NOP
36 NOP
37 NOP
38 JUMP_FORWARD 0 [to 41]
9 >> 41 LOAD_FAST 3 [result]
44 LOAD_ATTR 4 [append]
47 LOAD_FAST 2 [i]
50 CALL_FUNCTION 1
53 POP_TOP
10 54 LOAD_FAST 2 [i]
57 LOAD_CONST 1 [1]
60 INPLACE_ADD
61 STORE_FAST 2 [i]
11 64 JUMP_ABSOLUTE 19
67 NOP
68 NOP
69 NOP
70 NOP
13 71 NOP
72 NOP
73 NOP
74 NOP
75 NOP
76 NOP
77 NOP
14 >> 78 LOAD_FAST 3 [result]
81 RETURN_VALUE
Thực hiện thay thế
Ý tưởng về goto
trong Python không phải là mới. Có một mô -đun khác đã được phát hành dưới dạng trò đùa của April Cá vào năm 2004. Việc triển khai đó không chạm vào mã byte, nhưng sử dụng chức năng theo dõi, tương tự như cách viết gỡ lỗi.
Mặc dù điều này giúp loại bỏ sự cần thiết của một người trang trí, nhưng nó đi kèm với chi phí thời gian chạy đáng kể và thực hiện công phu hơn. Mặt khác, việc sửa đổi mã byte khá đơn giản và không thêm chi phí khi thực hiện chức năng.
Tải tập tin
Tải xuống tệp cho nền tảng của bạn. Nếu bạn không chắc chắn nên chọn cái nào, hãy tìm hiểu thêm về việc cài đặt các gói.