dis --- Trình giải mã bytecode Python¶
Source code: Lib/dis.py
Mô-đun dis hỗ trợ phân tích CPython bytecode bằng cách tháo rời nó. Mã byte CPython mà mô-đun này lấy làm đầu vào được xác định trong tệp Include/opcode.h và được trình biên dịch và trình thông dịch sử dụng.
Bytecode là chi tiết triển khai của trình thông dịch CPython. Không có đảm bảo nào được đưa ra rằng mã byte sẽ không được thêm, xóa hoặc thay đổi giữa các phiên bản Python. Việc sử dụng mô-đun này không được coi là hoạt động trên các máy ảo Python hoặc các bản phát hành Python.
Thay đổi trong phiên bản 3.6: Sử dụng 2 byte cho mỗi lệnh. Trước đây số byte thay đổi theo lệnh.
Thay đổi trong phiên bản 3.10: Đối số của lệnh nhảy, xử lý ngoại lệ và lệnh vòng lặp hiện là phần bù lệnh thay vì phần bù byte.
Thay đổi trong phiên bản 3.11: Một số hướng dẫn đi kèm với một hoặc nhiều mục nhập bộ nhớ đệm nội tuyến, có dạng hướng dẫn CACHE. Các hướng dẫn này được ẩn theo mặc định nhưng có thể được hiển thị bằng cách chuyển show_caches=True tới bất kỳ tiện ích dis nào. Hơn nữa, trình thông dịch hiện điều chỉnh mã byte để chuyên biệt hóa nó cho các điều kiện thời gian chạy khác nhau. Mã byte thích ứng có thể được hiển thị bằng cách chuyển adaptive=True.
Thay đổi trong phiên bản 3.12: Đối số của bước nhảy là độ lệch của lệnh đích so với lệnh xuất hiện ngay sau các mục CACHE của lệnh nhảy.
Do đó, sự hiện diện của các hướng dẫn CACHE là rõ ràng đối với các bước nhảy tiến nhưng cần được tính đến khi suy luận về các bước nhảy lùi.
Thay đổi trong phiên bản 3.13: Đầu ra hiển thị các nhãn logic thay vì chênh lệch lệnh cho mục tiêu nhảy và trình xử lý ngoại lệ. Tùy chọn dòng lệnh -O và đối số show_offsets đã được thêm vào.
Ví dụ: Cho hàm myfunc():
def myfunc(alist):
trả lại len(alist)
lệnh sau có thể được sử dụng để hiển thị quá trình tháo gỡ myfunc():
>>> dis.dis(myfunc)
2 RESUME 0
3 LOAD_GLOBAL 1 (len + NULL)
LOAD_FAST_BORROW 0 (danh sách)
CALL 1
RETURN_VALUE
("2" là số dòng).
Giao diện dòng lệnh¶
Mô-đun dis có thể được gọi dưới dạng tập lệnh từ dòng lệnh:
python -m dis [-h] [-C] [-O] [-P] [-S] [infile]
Các tùy chọn sau được chấp nhận:
- -h, --help¶
Hiển thị mức sử dụng và thoát.
- -C, --show-caches¶
Hiển thị bộ đệm nội tuyến.
Added in version 3.13.
- -O, --show-offsets¶
Hiển thị offset của hướng dẫn.
Added in version 3.13.
- -P, --show-positions¶
Hiển thị vị trí của hướng dẫn trong mã nguồn.
Added in version 3.14.
- -S, --specialized¶
Hiển thị mã byte chuyên dụng.
Added in version 3.14.
Nếu infile được chỉ định, mã đã được phân tách của nó sẽ được ghi vào thiết bị xuất chuẩn. Mặt khác, việc tháo gỡ được thực hiện trên mã nguồn đã biên dịch nhận được từ stdin.
Phân tích mã byte¶
Added in version 3.4.
Phân tích mã byte API cho phép các đoạn mã Python được gói trong một đối tượng Bytecode giúp dễ dàng truy cập vào các chi tiết của mã được biên dịch.
- class dis.Bytecode(x, *, first_line=None, current_offset=None, show_caches=False, adaptive=False, show_offsets=False, show_positions=False)¶
Phân tích mã byte tương ứng với hàm, trình tạo, trình tạo không đồng bộ, coroutine, phương thức, chuỗi mã nguồn hoặc đối tượng mã (được trả về bởi
compile()).Đây là một trình bao bọc tiện lợi xung quanh nhiều hàm được liệt kê bên dưới, đáng chú ý nhất là
get_instructions(), vì việc lặp qua một phiên bảnBytecodesẽ mang lại các hoạt động mã byte dưới dạng các phiên bảnInstruction.Nếu first_line không phải là
None, nó cho biết số dòng cần được báo cáo cho dòng nguồn đầu tiên trong mã đã được phân tách. Mặt khác, thông tin dòng nguồn (nếu có) được lấy trực tiếp từ đối tượng mã đã được tháo rời.Nếu current_offset không phải là
None, thì nó đề cập đến phần bù lệnh trong mã đã được dịch ngược. Đặt điều này có nghĩa làdis()sẽ hiển thị điểm đánh dấu "lệnh hiện tại" đối với mã hoạt động được chỉ định.Nếu show_caches là
True,dis()sẽ hiển thị các mục nhập bộ nhớ đệm nội tuyến được trình thông dịch sử dụng để chuyên biệt hóa mã byte.Nếu adaptive là
Truethìdis()sẽ hiển thị mã bytecode chuyên dụng có thể khác với mã byte ban đầu.Nếu show_offsets là
True,dis()sẽ bao gồm các lệnh bù trong đầu ra.Nếu show_positions là
True,dis()sẽ bao gồm các vị trí mã nguồn lệnh trong đầu ra.- classmethod from_traceback(tb, *, show_caches=False)¶
Xây dựng một phiên bản
Bytecodetừ traceback đã cho, đặt current_offset thành lệnh chịu trách nhiệm về ngoại lệ.
- codeobj¶
Đối tượng mã được biên dịch.
- first_line¶
Dòng nguồn đầu tiên của đối tượng mã (nếu có)
- dis()¶
Trả về chế độ xem được định dạng của các hoạt động mã byte (giống như được in bởi
dis.dis(), nhưng được trả về dưới dạng chuỗi nhiều dòng).
- info()¶
Trả về một chuỗi nhiều dòng được định dạng với thông tin chi tiết về đối tượng mã, như
code_info().
Thay đổi trong phiên bản 3.7: Điều này hiện có thể xử lý các đối tượng coroutine và trình tạo không đồng bộ.
Thay đổi trong phiên bản 3.11: Đã thêm thông số show_caches và adaptive.
Thay đổi trong phiên bản 3.13: Đã thêm tham số show_offsets
Thay đổi trong phiên bản 3.14: Đã thêm tham số show_positions.
Ví dụ:
>>> mã byte = dis.Bytecode(myfunc)
>>> cho instr trong mã byte:
... print(instr.opname)
...
RESUME
LOAD_GLOBAL
LOAD_FAST_BORROW
CALL
RETURN_VALUE
Chức năng phân tích¶
Mô-đun dis cũng xác định các chức năng phân tích sau để chuyển đổi trực tiếp đầu vào thành đầu ra mong muốn. Chúng có thể hữu ích nếu chỉ thực hiện một thao tác duy nhất, vì vậy đối tượng phân tích trung gian không hữu ích:
- dis.code_info(x)¶
Trả về một chuỗi nhiều dòng được định dạng với thông tin đối tượng mã chi tiết cho hàm được cung cấp, trình tạo, trình tạo không đồng bộ, coroutine, phương thức, chuỗi mã nguồn hoặc đối tượng mã.
Lưu ý rằng nội dung chính xác của chuỗi thông tin mã phụ thuộc nhiều vào việc triển khai và chúng có thể thay đổi tùy ý trên các máy ảo Python hoặc bản phát hành Python.
Added in version 3.2.
Thay đổi trong phiên bản 3.7: Điều này hiện có thể xử lý các đối tượng coroutine và trình tạo không đồng bộ.
- dis.show_code(x, *, file=None)¶
In thông tin đối tượng mã chi tiết cho hàm, phương thức, chuỗi mã nguồn hoặc đối tượng mã được cung cấp tới file (hoặc
sys.stdoutnếu file không được chỉ định).Đây là cách viết tắt thuận tiện cho
print(code_info(x), file=file), nhằm mục đích khám phá tương tác tại dấu nhắc của trình thông dịch.Added in version 3.2.
Thay đổi trong phiên bản 3.4: Đã thêm tham số file.
- dis.dis(x=None, *, file=None, depth=None, show_caches=False, adaptive=False, show_offsets=False, show_positions=False)¶
Tháo rời đối tượng x. x có thể biểu thị mô-đun, lớp, phương thức, hàm, trình tạo, trình tạo không đồng bộ, coroutine, đối tượng mã, chuỗi mã nguồn hoặc chuỗi byte của mã byte thô. Đối với một mô-đun, nó tháo rời tất cả các chức năng. Đối với một lớp, nó phân tách tất cả các phương thức (bao gồm cả các phương thức lớp và tĩnh). Đối với một đối tượng mã hoặc chuỗi mã byte thô, nó in một dòng trên mỗi lệnh mã byte. Nó cũng phân tách đệ quy các đối tượng mã lồng nhau. Chúng có thể bao gồm các biểu thức trình tạo, các hàm lồng nhau, nội dung của các lớp lồng nhau và các đối tượng mã được sử dụng cho annotation scopes. Các chuỗi đầu tiên được biên dịch để mã hóa các đối tượng bằng hàm tích hợp
compile()trước khi được phân tách. Nếu không có đối tượng nào được cung cấp, hàm này sẽ phân tách dấu vết cuối cùng.Việc tháo gỡ được viết dưới dạng văn bản cho đối số file được cung cấp nếu được cung cấp và
sys.stdoutnếu không.Độ sâu đệ quy tối đa bị giới hạn bởi depth trừ khi đó là
None.depth=0có nghĩa là không đệ quy.Nếu show_caches là
True, hàm này sẽ hiển thị các mục nhập bộ nhớ đệm nội tuyến được trình thông dịch sử dụng để chuyên biệt hóa mã byte.Nếu adaptive là
True, hàm này sẽ hiển thị mã bytecode chuyên dụng có thể khác với mã byte ban đầu.Thay đổi trong phiên bản 3.4: Đã thêm tham số file.
Thay đổi trong phiên bản 3.7: Đã triển khai quá trình phân tách đệ quy và thêm tham số depth.
Thay đổi trong phiên bản 3.7: Điều này hiện có thể xử lý các đối tượng coroutine và trình tạo không đồng bộ.
Thay đổi trong phiên bản 3.11: Đã thêm thông số show_caches và adaptive.
Thay đổi trong phiên bản 3.13: Đã thêm tham số show_offsets.
Thay đổi trong phiên bản 3.14: Đã thêm tham số show_positions.
- dis.distb(tb=None, *, file=None, show_caches=False, adaptive=False, show_offset=False, show_positions=False)¶
Tháo rời hàm top-of-stack của truy nguyên, sử dụng truy nguyên cuối cùng nếu không có truy nguyên nào được thông qua. Hướng dẫn gây ra ngoại lệ được chỉ định.
Việc tháo gỡ được viết dưới dạng văn bản cho đối số file được cung cấp nếu được cung cấp và
sys.stdoutnếu không.Thay đổi trong phiên bản 3.4: Đã thêm tham số file.
Thay đổi trong phiên bản 3.11: Đã thêm thông số show_caches và adaptive.
Thay đổi trong phiên bản 3.13: Đã thêm tham số show_offsets.
Thay đổi trong phiên bản 3.14: Đã thêm tham số show_positions.
- dis.disassemble(code, lasti=-1, *, file=None, show_caches=False, adaptive=False, show_offsets=False, show_positions=False)¶
- dis.disco(code, lasti=-1, *, file=None, show_caches=False, adaptive=False, show_offsets=False, show_positions=False)¶
Tháo rời một đối tượng mã, cho biết lệnh cuối cùng nếu lasti được cung cấp. Đầu ra được chia thành các cột sau:
vị trí mã nguồn của lệnh. Thông tin vị trí đầy đủ được hiển thị nếu show_positions là đúng. Ngược lại (mặc định) chỉ hiển thị số dòng.
lệnh hiện tại, được biểu thị là
-->,một hướng dẫn có nhãn, được biểu thị bằng
>>,địa chỉ của hướng dẫn,
tên mã hoạt động,
các thông số hoạt động và
giải thích các tham số trong ngoặc đơn.
Việc giải thích tham số nhận dạng tên biến cục bộ và toàn cục, giá trị không đổi, mục tiêu nhánh và toán tử so sánh.
Việc tháo gỡ được viết dưới dạng văn bản cho đối số file được cung cấp nếu được cung cấp và
sys.stdoutnếu không.Thay đổi trong phiên bản 3.4: Đã thêm tham số file.
Thay đổi trong phiên bản 3.11: Đã thêm thông số show_caches và adaptive.
Thay đổi trong phiên bản 3.13: Đã thêm tham số show_offsets.
Thay đổi trong phiên bản 3.14: Đã thêm tham số show_positions.
- dis.get_instructions(x, *, first_line=None, show_caches=False, adaptive=False)¶
Trả về một trình vòng lặp qua các hướng dẫn trong hàm, phương thức, chuỗi mã nguồn hoặc đối tượng mã được cung cấp.
Trình vòng lặp tạo ra một loạt các bộ dữ liệu có tên
Instructioncung cấp thông tin chi tiết về từng thao tác trong mã được cung cấp.Nếu first_line không phải là
None, nó cho biết số dòng cần được báo cáo cho dòng nguồn đầu tiên trong mã đã được phân tách. Mặt khác, thông tin dòng nguồn (nếu có) được lấy trực tiếp từ đối tượng mã đã được tháo rời.Tham số adaptive hoạt động giống như trong
dis().Added in version 3.4.
Thay đổi trong phiên bản 3.11: Đã thêm thông số show_caches và adaptive.
Thay đổi trong phiên bản 3.13: Tham số show_caches không được dùng nữa và không có hiệu lực. Trình vòng lặp tạo ra các phiên bản
Instructionvới trường cache_info được điền (bất kể giá trị của show_caches) và nó không còn tạo các mục riêng biệt cho các mục trong bộ nhớ đệm nữa.
- dis.findlinestarts(code)¶
Hàm tạo này sử dụng phương thức
co_lines()của code object code để tìm các giá trị bù là điểm bắt đầu của các dòng trong mã nguồn. Chúng được tạo dưới dạng cặp(offset, lineno).Thay đổi trong phiên bản 3.6: Số dòng có thể giảm. Trước đây, chúng luôn tăng lên.
Thay đổi trong phiên bản 3.10: Phương thức PEP 626
co_lines()được sử dụng thay cho các thuộc tínhco_firstlinenovàco_lnotabcủa code object.Thay đổi trong phiên bản 3.13: Số dòng có thể là
Noneđối với mã byte không ánh xạ tới dòng nguồn.
- dis.findlabels(code)¶
Phát hiện tất cả các giá trị chênh lệch trong chuỗi mã byte được biên dịch thô code là mục tiêu nhảy và trả về danh sách các giá trị chênh lệch này.
- dis.stack_effect(opcode, oparg=None, *, jump=None)¶
Tính hiệu ứng ngăn xếp của opcode với đối số oparg.
Nếu mã có mục tiêu nhảy và jump là
True,stack_effect()sẽ trả về hiệu ứng ngăn xếp của việc nhảy. Nếu jump làFalse, nó sẽ trả về hiệu ứng ngăn xếp không nhảy. Và nếu jump làNone(mặc định), nó sẽ trả về hiệu ứng ngăn xếp tối đa của cả hai trường hợp.Added in version 3.4.
Thay đổi trong phiên bản 3.8: Đã thêm tham số jump.
Thay đổi trong phiên bản 3.13: Nếu
opargbị bỏ qua (hoặcNone), hiệu ứng ngăn xếp hiện được trả về chooparg=0. Trước đây đây là lỗi đối với các opcode sử dụng đối số của chúng. Việc truyền số nguyênopargkhiopcodekhông sử dụng nó cũng không còn là lỗi nữa;opargtrong trường hợp này bị bỏ qua.
Hướng dẫn mã byte Python¶
Hàm get_instructions() và lớp Bytecode cung cấp chi tiết về hướng dẫn mã byte dưới dạng phiên bản Instruction:
- class dis.Instruction¶
Thông tin chi tiết về hoạt động mã byte
- opcode¶
mã số để vận hành, tương ứng với các giá trị opcode được liệt kê bên dưới và các giá trị mã byte trong Bộ sưu tập mã opcode.
- opname¶
tên con người có thể đọc được cho hoạt động
- baseopname¶
tên dễ đọc của con người đối với hoạt động cơ sở nếu hoạt động là chuyên biệt; nếu không thì bằng
opname
- arg¶
đối số số cho phép toán (nếu có), nếu không thì
None
- argval¶
giá trị arg đã giải quyết (nếu có), nếu không thì
None
- argrepr¶
mô tả đối số hoạt động mà con người có thể đọc được (nếu có), nếu không thì là một chuỗi trống.
- offset¶
chỉ mục bắt đầu hoạt động trong chuỗi mã byte
- start_offset¶
chỉ mục bắt đầu hoạt động trong chuỗi mã byte, bao gồm các hoạt động
EXTENDED_ARGcó tiền tố nếu có; nếu không thì bằngoffset
- cache_offset¶
chỉ mục bắt đầu của các mục bộ đệm sau thao tác
- end_offset¶
chỉ mục cuối cùng của các mục bộ đệm sau thao tác
- starts_line¶
Truenếu opcode này bắt đầu một dòng nguồn, nếu không thìFalse
- line_number¶
số dòng nguồn được liên kết với opcode này (nếu có), nếu không thì
None
- is_jump_target¶
Truenếu mã khác nhảy vào đây, nếu không thìFalse
- jump_target¶
chỉ mục mã byte của mục tiêu nhảy nếu đây là thao tác nhảy, nếu không thì
None
- positions¶
Đối tượng
dis.Positionsgiữ vị trí bắt đầu và kết thúc được đề cập trong hướng dẫn này.
- cache_info¶
Thông tin về các mục bộ đệm của lệnh này, dưới dạng bộ ba có dạng
(name, size, data), trong đónamevàsizemô tả định dạng bộ đệm và dữ liệu là nội dung của bộ đệm.cache_infolàNonenếu lệnh không có bộ đệm.
Added in version 3.4.
Thay đổi trong phiên bản 3.11: Trường
positionsđược thêm vào.Thay đổi trong phiên bản 3.13: Đã thay đổi trường
starts_line.Đã thêm các trường
start_offset,cache_offset,end_offset,baseopname,baseopcode,jump_target,oparg,line_numbervàcache_info.
- class dis.Positions¶
Trong trường hợp không có thông tin, một số trường có thể là
None.- lineno¶
- end_lineno¶
- col_offset¶
- end_col_offset¶
Added in version 3.11.
Trình biên dịch Python hiện tạo các hướng dẫn mã byte sau.
General instructions
Sau đây, chúng tôi sẽ gọi ngăn xếp trình thông dịch là STACK và mô tả các thao tác trên nó như thể nó là một danh sách Python. Phần trên cùng của ngăn xếp tương ứng với STACK[-1] trong ngôn ngữ này.
- NOP¶
Không làm gì cả. Được sử dụng làm trình giữ chỗ bởi trình tối ưu hóa mã byte và để tạo các sự kiện dò dòng.
- NOT_TAKEN¶
Không làm gì cả. Được trình thông dịch sử dụng để ghi lại các sự kiện
BRANCH_LEFTvàBRANCH_RIGHTchosys.monitoring.Added in version 3.14.
- POP_ITER¶
Loại bỏ iterator khỏi đầu ngăn xếp.
Added in version 3.14.
- POP_TOP¶
Xóa mục đầu ngăn xếp:
STACK.pop()
- END_FOR¶
Loại bỏ mục trên cùng của ngăn xếp. Tương đương với
POP_TOP. Được sử dụng để dọn dẹp ở cuối vòng lặp, do đó có tên như vậy.Added in version 3.12.
- END_SEND¶
Triển khai
del STACK[-2]. Được sử dụng để dọn dẹp khi máy phát điện thoát ra.Added in version 3.12.
- COPY(i)¶
Đẩy mục thứ i lên đầu ngăn xếp mà không xóa nó khỏi vị trí ban đầu:
khẳng định tôi > 0 STACK.append(STACK[-i])
Added in version 3.11.
- SWAP(i)¶
Hoán đổi phần trên cùng của ngăn xếp với phần tử thứ i
STACK[-i], STACK[-1] = STACK[-1], STACK[-i]
Added in version 3.11.
- CACHE¶
Thay vì là một hướng dẫn thực tế, opcode này được sử dụng để đánh dấu thêm không gian cho trình thông dịch lưu trữ dữ liệu hữu ích trực tiếp trong chính mã byte. Nó được tự động ẩn bởi tất cả các tiện ích
dis, nhưng có thể xem được bằngshow_caches=True.Về mặt logic, khoảng trống này là một phần của lệnh trước đó. Nhiều opcode mong muốn được theo sau bởi một số lượng bộ đệm chính xác và sẽ hướng dẫn trình thông dịch bỏ qua chúng khi chạy.
Bộ nhớ đệm phổ biến có thể trông giống như các hướng dẫn tùy ý, vì vậy cần hết sức cẩn thận khi đọc hoặc sửa đổi mã byte thích ứng thô chứa dữ liệu được tăng tốc.
Added in version 3.11.
Unary operations
Các phép toán một ngôi chiếm phần trên cùng của ngăn xếp, áp dụng thao tác đó và đẩy kết quả trở lại ngăn xếp.
- UNARY_NEGATIVE¶
Triển khai
STACK[-1] = -STACK[-1].
- UNARY_NOT¶
Triển khai
STACK[-1] = not STACK[-1].Thay đổi trong phiên bản 3.13: Lệnh này hiện yêu cầu toán hạng
boolchính xác.
- UNARY_INVERT¶
Triển khai
STACK[-1] = ~STACK[-1].
- GET_ITER¶
Triển khai
STACK[-1] = iter(STACK[-1]).
- GET_YIELD_FROM_ITER¶
Nếu
STACK[-1]là một đối tượng generator iterator hoặc coroutine thì nó vẫn được giữ nguyên. Ngược lại, thực hiệnSTACK[-1] = iter(STACK[-1]).Added in version 3.5.
- TO_BOOL¶
Triển khai
STACK[-1] = bool(STACK[-1]).Added in version 3.13.
Binary and in-place operations
Các phép toán nhị phân loại bỏ hai mục trên cùng khỏi ngăn xếp (STACK[-1] và STACK[-2]). Họ thực hiện thao tác, sau đó đưa kết quả trở lại ngăn xếp.
Các thao tác tại chỗ giống như các thao tác nhị phân, nhưng thao tác được thực hiện tại chỗ khi STACK[-2] hỗ trợ nó và STACK[-1] thu được có thể (nhưng không nhất thiết phải là) STACK[-2] ban đầu.
- BINARY_OP(op)¶
Triển khai các toán tử nhị phân và tại chỗ (tùy thuộc vào giá trị của op):
rhs = STACK.pop() lhs = STACK.pop() STACK.append(lhs op rhs)
Added in version 3.11.
Thay đổi trong phiên bản 3.14: Với oparg :
NB_SUBSCR, thực hiện chỉ số nhị phân (thay thế opcodeBINARY_SUBSCR)
- STORE_SUBSCR¶
Thực hiện:
khóa = STACK.pop() vùng chứa = STACK.pop() giá trị = STACK.pop() vùng chứa [khóa] = giá trị
- DELETE_SUBSCR¶
Thực hiện:
khóa = STACK.pop() vùng chứa = STACK.pop() del vùng chứa [khóa]
- BINARY_SLICE¶
Thực hiện:
kết thúc = STACK.pop() bắt đầu = STACK.pop() vùng chứa = STACK.pop() STACK.append(container[start:end])
Added in version 3.12.
- STORE_SLICE¶
Thực hiện:
kết thúc = STACK.pop() bắt đầu = STACK.pop() vùng chứa = STACK.pop() giá trị = STACK.pop() vùng chứa [bắt đầu: kết thúc] = giá trị
Added in version 3.12.
Coroutine opcodes
- GET_AWAITABLE(where)¶
Triển khai
STACK[-1] = get_awaitable(STACK[-1]), trong đóget_awaitable(o)trả vềonếuolà đối tượng coroutine hoặc đối tượng trình tạo có cờCO_ITERABLE_COROUTINEhoặc phân giảio.__await__.Nếu toán hạng
wherekhác 0, nó cho biết lệnh xuất hiện ở đâu:1: Sau cuộc gọi tới__aenter__2: Sau cuộc gọi tới__aexit__
Added in version 3.5.
Thay đổi trong phiên bản 3.11: Trước đây, hướng dẫn này không có oparg.
- GET_AITER¶
Triển khai
STACK[-1] = STACK[-1].__aiter__().Added in version 3.5.
Thay đổi trong phiên bản 3.7: Trả lại các đối tượng có thể chờ từ
__aiter__không còn được hỗ trợ.
- GET_ANEXT¶
Triển khai
STACK.append(get_awaitable(STACK[-1].__anext__()))vào ngăn xếp. XemGET_AWAITABLEđể biết chi tiết vềget_awaitable.Added in version 3.5.
- END_ASYNC_FOR¶
Chấm dứt vòng lặp
async for. Xử lý một ngoại lệ được đưa ra khi chờ mục tiếp theo. Ngăn xếp chứa async iterable trongSTACK[-2]và ngoại lệ được nêu ra trongSTACK[-1]. Cả hai đều được bật lên. Nếu ngoại lệ không phải làStopAsyncIteration, nó sẽ được đưa ra lại.Added in version 3.8.
Thay đổi trong phiên bản 3.11: Biểu diễn ngoại lệ trên ngăn xếp hiện bao gồm một chứ không phải ba mục.
- CLEANUP_THROW¶
Xử lý ngoại lệ được đưa ra trong lệnh gọi
throw()hoặcclose()thông qua khung hiện tại. NếuSTACK[-1]là một phiên bản củaStopIteration, hãy lấy ba giá trị từ ngăn xếp và đẩy thành viênvaluecủa nó. Nếu không, hãy nâng lạiSTACK[-1].Added in version 3.12.
Miscellaneous opcodes
- SET_ADD(i)¶
Thực hiện:
mục = STACK.pop() set.add(STACK[-i], item)
Được sử dụng để thực hiện việc hiểu tập hợp.
- LIST_APPEND(i)¶
Thực hiện:
mục = STACK.pop() list.append(STACK[-i], item)
Được sử dụng để thực hiện việc hiểu danh sách.
- MAP_ADD(i)¶
Thực hiện:
giá trị = STACK.pop() khóa = STACK.pop() dict.__setitem__(STACK[-i], khóa, giá trị)
Được sử dụng để thực hiện việc hiểu chính tả.
Added in version 3.1.
Thay đổi trong phiên bản 3.8: Giá trị bản đồ là
STACK[-1]và khóa bản đồ làSTACK[-2]. Trước đây, những điều đó đã bị đảo ngược.
Đối với tất cả các hướng dẫn SET_ADD, LIST_APPEND và MAP_ADD, trong khi giá trị gia tăng hoặc cặp khóa/giá trị được bật ra, đối tượng vùng chứa vẫn còn trên ngăn xếp để nó có sẵn cho các lần lặp tiếp theo của vòng lặp.
- RETURN_VALUE¶
Trả về
STACK[-1]cho người gọi hàm.
- YIELD_VALUE¶
Mang lại
STACK.pop()từ generator.Thay đổi trong phiên bản 3.11: oparg được đặt thành độ sâu ngăn xếp.
Thay đổi trong phiên bản 3.12: oparg được đặt thành độ sâu khối ngoại lệ, để đóng máy phát điện hiệu quả.
Thay đổi trong phiên bản 3.13: oparg là
1nếu lệnh này là một phần của kết quả thu được hoặc đang chờ và0nếu ngược lại.
- SETUP_ANNOTATIONS¶
Kiểm tra xem
__annotations__có được xác định tronglocals()hay không, nếu không nó sẽ được thiết lập thànhdicttrống. Opcode này chỉ được phát ra nếu một lớp hoặc nội dung mô-đun chứa variable annotations tĩnh.Added in version 3.6.
- POP_EXCEPT¶
Lấy ra một giá trị từ ngăn xếp, giá trị này được sử dụng để khôi phục trạng thái ngoại lệ.
Thay đổi trong phiên bản 3.11: Biểu diễn ngoại lệ trên ngăn xếp hiện bao gồm một chứ không phải ba mục.
- RERAISE¶
Tăng lại ngoại lệ hiện có trên đầu ngăn xếp. Nếu oparg khác 0, hãy bật ra một giá trị bổ sung từ ngăn xếp được sử dụng để đặt
f_lasticủa khung hiện tại.Added in version 3.9.
Thay đổi trong phiên bản 3.11: Biểu diễn ngoại lệ trên ngăn xếp hiện bao gồm một chứ không phải ba mục.
- PUSH_EXC_INFO¶
Lấy ra một giá trị từ ngăn xếp. Đẩy ngoại lệ hiện tại lên đầu ngăn xếp. Đẩy giá trị ban đầu được lấy ra trở lại ngăn xếp. Được sử dụng trong các trình xử lý ngoại lệ.
Added in version 3.11.
- CHECK_EXC_MATCH¶
Thực hiện khớp ngoại lệ cho
except. Kiểm tra xemSTACK[-2]có phải là ngoại lệ phù hợp vớiSTACK[-1]hay không. BậtSTACK[-1]và đẩy kết quả boolean của bài kiểm tra.Added in version 3.11.
- CHECK_EG_MATCH¶
Thực hiện khớp ngoại lệ cho
except*. Áp dụngsplit(STACK[-1])trên nhóm ngoại lệ đại diện choSTACK[-2].Trong trường hợp trùng khớp, lấy ra hai mục từ ngăn xếp và đẩy nhóm con không khớp (
Nonetrong trường hợp khớp hoàn toàn) theo sau là nhóm con khớp. Khi không có kết quả phù hợp, bật lên một mục (loại phù hợp) và đẩyNone.Added in version 3.11.
- WITH_EXCEPT_START¶
Gọi hàm ở vị trí 4 trên ngăn xếp với các đối số (type, val, tb) biểu thị ngoại lệ ở đầu ngăn xếp. Được sử dụng để thực hiện lệnh gọi
context_manager.__exit__(*exc_info())khi xảy ra ngoại lệ trong câu lệnhwith.Added in version 3.9.
Thay đổi trong phiên bản 3.11: Hàm
__exit__ở vị trí 4 của ngăn xếp thay vì 7. Biểu diễn ngoại lệ trên ngăn xếp hiện bao gồm một chứ không phải ba mục.
- LOAD_COMMON_CONSTANT¶
Đẩy một hằng số chung vào ngăn xếp. Trình thông dịch chứa một danh sách các hằng số được mã hóa cứng được hỗ trợ bởi lệnh này. Được sử dụng bởi câu lệnh
assertđể tảiAssertionError.Added in version 3.14.
- LOAD_BUILD_CLASS¶
Đẩy
builtins.__build_class__()vào ngăn xếp. Sau đó nó được gọi để xây dựng một lớp.
- GET_LEN¶
Thực hiện
STACK.append(len(STACK[-1])). Được sử dụng trong các câu lệnhmatchkhi cần so sánh với cấu trúc của mẫu.Added in version 3.10.
- MATCH_MAPPING¶
Nếu
STACK[-1]là một phiên bản củacollections.abc.Mapping(hoặc, về mặt kỹ thuật hơn: nếu nó có cờPy_TPFLAGS_MAPPINGđược đặt trongtp_flags), hãy đẩyTruevào ngăn xếp. Nếu không, hãy nhấnFalse.Added in version 3.10.
- MATCH_SEQUENCE¶
Nếu
STACK[-1]là một phiên bản củacollections.abc.Sequencevà not là một phiên bản củastr/bytes/bytearray(hoặc kỹ thuật hơn: nếu nó có cờPy_TPFLAGS_SEQUENCEđược đặt trongtp_flags), hãy đẩyTruevào ngăn xếp. Nếu không, hãy nhấnFalse.Added in version 3.10.
- MATCH_KEYS¶
STACK[-1]là một bộ khóa ánh xạ vàSTACK[-2]là đối tượng phù hợp. NếuSTACK[-2]chứa tất cả các khóa trongSTACK[-1], hãy đẩytuplechứa các giá trị tương ứng. Nếu không, hãy nhấnNone.Added in version 3.10.
Thay đổi trong phiên bản 3.11: Trước đây, lệnh này cũng đẩy một giá trị boolean biểu thị thành công (
True) hoặc thất bại (False).
- STORE_NAME(namei)¶
Triển khai
name = STACK.pop(). namei là chỉ mục của name trong thuộc tínhco_namescủa code object. Trình biên dịch cố gắng sử dụngSTORE_FASThoặcSTORE_GLOBALnếu có thể.
- DELETE_NAME(namei)¶
Triển khai
del name, trong đó namei là chỉ mục của thuộc tínhco_namescủa code object.
- UNPACK_SEQUENCE(count)¶
Giải nén
STACK[-1]thành các giá trị riêng lẻ của count, được đặt vào ngăn xếp từ phải sang trái. Yêu cầu phải có chính xác giá trị count.:khẳng định(len(STACK[-1]) == đếm) STACK.extend(STACK.pop()[:-count-1:-1])
- UNPACK_EX(counts)¶
Triển khai phép gán với mục tiêu được gắn dấu sao: Giải nén một iterable trong
STACK[-1]thành các giá trị riêng lẻ, trong đó tổng số giá trị có thể nhỏ hơn số mục trong iterable: một trong các giá trị mới sẽ là danh sách tất cả các mục còn sót lại.Số lượng giá trị trước và sau giá trị danh sách được giới hạn ở 255.
Số lượng giá trị trước giá trị danh sách được mã hóa trong đối số của opcode. Số giá trị sau danh sách nếu có được mã hóa bằng
EXTENDED_ARG. Kết quả là, đối số có thể được xem dưới dạng giá trị hai byte trong đó byte thấp của counts là số giá trị trước giá trị danh sách, byte cao của counts là số giá trị sau nó.Các giá trị được trích xuất sẽ được đặt vào ngăn xếp từ phải sang trái, tức là
a, *b, c = dsẽ được lưu trữ sau khi thực thi dưới dạngSTACK.extend((a, b, c)).
- STORE_ATTR(namei)¶
Thực hiện:
obj = STACK.pop() giá trị = STACK.pop() obj.name = giá trị
trong đó namei là chỉ mục tên trong
co_namescủa code object.
- DELETE_ATTR(namei)¶
Thực hiện:
obj = STACK.pop() del obj.name
trong đó namei là chỉ mục tên của
co_namescủa code object.
- STORE_GLOBAL(namei)¶
Hoạt động như
STORE_NAME, nhưng lưu tên dưới dạng chung.
- DELETE_GLOBAL(namei)¶
Hoạt động như
DELETE_NAMEnhưng xóa tên chung.
- LOAD_CONST(consti)¶
Đẩy
co_consts[consti]vào ngăn xếp.
- LOAD_SMALL_INT(i)¶
Đẩy số nguyên
ivào ngăn xếp.iphải ở trongrange(256)Added in version 3.14.
- LOAD_NAME(namei)¶
Đẩy giá trị được liên kết với
co_names[namei]vào ngăn xếp. Tên được tra cứu trong nội dung địa phương, sau đó là toàn cầu, sau đó là nội dung.
- LOAD_LOCALS¶
Đẩy một tham chiếu đến từ điển địa phương vào ngăn xếp. Điều này được sử dụng để chuẩn bị từ điển không gian tên cho
LOAD_FROM_DICT_OR_DEREFvàLOAD_FROM_DICT_OR_GLOBALS.Added in version 3.12.
- LOAD_FROM_DICT_OR_GLOBALS(i)¶
Bật ánh xạ ra khỏi ngăn xếp và tra cứu giá trị cho
co_names[namei]. Nếu không tìm thấy tên ở đó, hãy tra cứu nó trong phần tổng thể và sau đó là nội dung, tương tự nhưLOAD_GLOBAL. Điều này được sử dụng để tải các biến toàn cục trong annotation scopes trong nội dung lớp.Added in version 3.12.
- BUILD_TEMPLATE¶
Tạo một phiên bản
Templatemới từ một bộ chuỗi và một bộ nội suy rồi đẩy đối tượng kết quả vào ngăn xếp:nội suy = STACK.pop() chuỗi = STACK.pop() STACK.append(_build_template(chuỗi, nội suy))
Added in version 3.14.
- BUILD_INTERPOLATION(format)¶
Tạo một phiên bản
Interpolationmới từ một giá trị và biểu thức nguồn của nó rồi đẩy đối tượng kết quả vào ngăn xếp.Nếu không có thông số chuyển đổi hoặc định dạng,
formatđược đặt thành2.Nếu bit thấp của
formatđược đặt, điều đó cho biết nội suy chứa thông số định dạng.Nếu
format >> 2khác 0, điều đó cho biết nội suy có chứa chuyển đổi. Giá trị củaformat >> 2là loại chuyển đổi (0cho không chuyển đổi,1cho!s,2cho!rvà3cho!a):chuyển đổi = định dạng >> 2 nếu định dạng & 1: format_spec = STACK.pop() khác: format_spec = Không có biểu thức = STACK.pop() giá trị = STACK.pop() STACK.append(_build_interpolation(giá trị, biểu thức, chuyển đổi, format_spec))
Added in version 3.14.
- BUILD_TUPLE(count)¶
Tạo một bộ dữ liệu tiêu thụ các mục count từ ngăn xếp và đẩy bộ dữ liệu kết quả vào ngăn xếp:
nếu đếm == 0: giá trị = () khác: giá trị = tuple(STACK[-count:]) STACK = STACK[:-count] STACK.append(giá trị)
- BUILD_LIST(count)¶
Hoạt động như
BUILD_TUPLEnhưng tạo danh sách.
- BUILD_SET(count)¶
Hoạt động như
BUILD_TUPLEnhưng tạo một bộ.
- BUILD_MAP(count)¶
Đẩy một đối tượng từ điển mới vào ngăn xếp. Hiển thị các mục
2 * countđể từ điển chứa các mục count:{..., STACK[-4]: STACK[-3], STACK[-2]: STACK[-1]}.Thay đổi trong phiên bản 3.5: Từ điển được tạo từ các mục ngăn xếp thay vì tạo một từ điển trống có kích thước sẵn để chứa các mục count.
- BUILD_STRING(count)¶
Nối các chuỗi count từ ngăn xếp và đẩy chuỗi kết quả vào ngăn xếp.
Added in version 3.6.
- LIST_EXTEND(i)¶
Thực hiện:
seq = STACK.pop() list.extend(STACK[-i], seq)
Được sử dụng để xây dựng danh sách.
Added in version 3.9.
- SET_UPDATE(i)¶
Thực hiện:
seq = STACK.pop() set.update(STACK[-i], seq)
Được sử dụng để xây dựng bộ.
Added in version 3.9.
- DICT_UPDATE(i)¶
Thực hiện:
bản đồ = STACK.pop() dict.update(STACK[-i], bản đồ)
Được sử dụng để xây dựng dict.
Added in version 3.9.
- DICT_MERGE(i)¶
Giống như
DICT_UPDATEnhưng có ngoại lệ đối với các khóa trùng lặp.Added in version 3.9.
- LOAD_ATTR(namei)¶
Nếu bit thấp của
nameikhông được đặt, nó sẽ thay thếSTACK[-1]bằnggetattr(STACK[-1], co_names[namei>>1]).Nếu bit thấp của
nameiđược đặt, điều này sẽ cố tải một phương thức có tênco_names[namei>>1]từ đối tượngSTACK[-1].STACK[-1]được bật lên. Mã byte này phân biệt hai trường hợp: nếuSTACK[-1]có một phương thức có tên chính xác, thì mã byte sẽ đẩy phương thức không liên kết vàSTACK[-1].STACK[-1]sẽ đượcCALLhoặcCALL_KWsử dụng làm đối số đầu tiên (self) khi gọi phương thức không liên kết. Nếu không,NULLvà đối tượng được tra cứu thuộc tính trả về sẽ được đẩy.Thay đổi trong phiên bản 3.12: Nếu bit thấp của
nameiđược đặt thìNULLhoặcselfsẽ được đẩy vào ngăn xếp trước thuộc tính hoặc phương thức không liên kết tương ứng.
- LOAD_SUPER_ATTR(namei)¶
Opcode này triển khai
super(), cả ở dạng không đối số và hai đối số (ví dụ:super().method(),super().attrvàsuper(cls, self).method(),super(cls, self).attr).Nó lấy ra ba giá trị từ ngăn xếp (từ đầu ngăn xếp trở xuống):
self: đối số đầu tiên của phương thức hiện tạicls: lớp trong đó phương thức hiện tại được xác địnhsupertoàn cầu
Về đối số của nó, nó hoạt động tương tự như
LOAD_ATTR, ngoại trừ việcnameiđược dịch chuyển sang trái 2 bit thay vì 1.Bit thấp của
nameibáo hiệu để thử tải phương thức, như vớiLOAD_ATTR, dẫn đến việc đẩyNULLvà phương thức đã tải. Khi nó không được đặt, một giá trị sẽ được đẩy vào ngăn xếp.Bit thấp thứ hai của
namei, nếu được đặt, có nghĩa là đây là lệnh gọi hai đối số tớisuper()(không đặt có nghĩa là không có đối số).Added in version 3.12.
- COMPARE_OP(opname)¶
Thực hiện một phép toán Boolean. Tên hoạt động có thể được tìm thấy trong
cmp_op[opname >> 5]. Nếu bit thấp thứ năm củaopnameđược đặt (opname & 16), kết quả sẽ bị ép buộc thànhbool.Thay đổi trong phiên bản 3.13: Bit thấp thứ năm của oparg hiện biểu thị chuyển đổi bắt buộc sang
bool.
- IS_OP(invert)¶
Thực hiện so sánh
ishoặcis notnếuinvertlà 1.Added in version 3.9.
- CONTAINS_OP(invert)¶
Thực hiện so sánh
inhoặcnot innếuinvertlà 1.Added in version 3.9.
- IMPORT_NAME(namei)¶
Nhập mô-đun
co_names[namei].STACK[-1]vàSTACK[-2]được xuất hiện và cung cấp các đối số fromlist và level của__import__(). Đối tượng mô-đun được đẩy vào ngăn xếp. Không gian tên hiện tại không bị ảnh hưởng: để có câu lệnh nhập thích hợp, lệnhSTORE_FASTtiếp theo sẽ sửa đổi không gian tên.
- IMPORT_FROM(namei)¶
Tải thuộc tính
co_names[namei]từ mô-đun tìm thấy trongSTACK[-1]. Đối tượng kết quả được đẩy vào ngăn xếp, sau đó được lưu trữ bằng lệnhSTORE_FAST.
- JUMP_FORWARD(delta)¶
Tăng bộ đếm mã byte thêm delta.
- JUMP_BACKWARD(delta)¶
Giảm bộ đếm bytecode đi delta. Kiểm tra các ngắt.
Added in version 3.11.
- JUMP_BACKWARD_NO_INTERRUPT(delta)¶
Giảm bộ đếm bytecode đi delta. Không kiểm tra các ngắt.
Added in version 3.11.
- POP_JUMP_IF_TRUE(delta)¶
Nếu
STACK[-1]là đúng, hãy tăng bộ đếm mã byte lên delta.STACK[-1]được bật lên.Thay đổi trong phiên bản 3.11: Oparg bây giờ là một đồng bằng tương đối chứ không phải là một mục tiêu tuyệt đối. Mã hoạt động này là một lệnh giả, được thay thế trong mã byte cuối cùng bằng các phiên bản được định hướng (tiến/lùi).
Thay đổi trong phiên bản 3.12: Đây không còn là một hướng dẫn giả nữa.
Thay đổi trong phiên bản 3.13: Lệnh này hiện yêu cầu toán hạng
boolchính xác.
- POP_JUMP_IF_FALSE(delta)¶
Nếu
STACK[-1]sai, hãy tăng bộ đếm mã byte lên delta.STACK[-1]được bật lên.Thay đổi trong phiên bản 3.11: Oparg bây giờ là một đồng bằng tương đối chứ không phải là một mục tiêu tuyệt đối. Mã hoạt động này là một lệnh giả, được thay thế trong mã byte cuối cùng bằng các phiên bản được định hướng (tiến/lùi).
Thay đổi trong phiên bản 3.12: Đây không còn là một hướng dẫn giả nữa.
Thay đổi trong phiên bản 3.13: Lệnh này hiện yêu cầu toán hạng
boolchính xác.
- POP_JUMP_IF_NOT_NONE(delta)¶
Nếu
STACK[-1]không phải làNone, hãy tăng bộ đếm mã byte lên delta.STACK[-1]được bật lên.Added in version 3.11.
Thay đổi trong phiên bản 3.12: Đây không còn là một hướng dẫn giả nữa.
- POP_JUMP_IF_NONE(delta)¶
Nếu
STACK[-1]làNone, hãy tăng bộ đếm mã byte lên delta.STACK[-1]được bật lên.Added in version 3.11.
Thay đổi trong phiên bản 3.12: Đây không còn là một hướng dẫn giả nữa.
- FOR_ITER(delta)¶
STACK[-1]là iterator. Gọi phương thức__next__()của nó. Nếu điều này mang lại một giá trị mới, hãy đẩy nó vào ngăn xếp (để lại trình vòng lặp bên dưới nó). Nếu trình lặp cho biết nó đã hết thì bộ đếm mã byte sẽ tăng thêm delta.Thay đổi trong phiên bản 3.12: Cho đến phiên bản 3.11, trình vòng lặp đã được bật khi nó cạn kiệt.
- LOAD_GLOBAL(namei)¶
Tải tên toàn cầu
co_names[namei>>1]vào ngăn xếp.Thay đổi trong phiên bản 3.11: Nếu bit thấp của
nameiđược đặt thìNULLsẽ được đẩy vào ngăn xếp trước biến toàn cục.
- LOAD_FAST(var_num)¶
Đẩy một tham chiếu tới
co_varnames[var_num]cục bộ vào ngăn xếp.Thay đổi trong phiên bản 3.12: Opcode này hiện chỉ được sử dụng trong các trường hợp biến cục bộ được đảm bảo được khởi tạo. Nó không thể tăng
UnboundLocalError.
- LOAD_FAST_BORROW(var_num)¶
Đẩy một tham chiếu mượn tới
co_varnames[var_num]cục bộ vào ngăn xếp.Added in version 3.14.
- LOAD_FAST_LOAD_FAST(var_nums)¶
Đẩy các tham chiếu đến
co_varnames[var_nums >> 4]vàco_varnames[var_nums & 15]vào ngăn xếp.Added in version 3.13.
- LOAD_FAST_BORROW_LOAD_FAST_BORROW(var_nums)¶
Đẩy các tham chiếu mượn tới
co_varnames[var_nums >> 4]vàco_varnames[var_nums & 15]vào ngăn xếp.Added in version 3.14.
- LOAD_FAST_CHECK(var_num)¶
Đẩy tham chiếu đến
co_varnames[var_num]cục bộ vào ngăn xếp, tăngUnboundLocalErrornếu biến cục bộ chưa được khởi tạo.Added in version 3.12.
- LOAD_FAST_AND_CLEAR(var_num)¶
Đẩy tham chiếu đến
co_varnames[var_num]cục bộ vào ngăn xếp (hoặc đẩyNULLvào ngăn xếp nếu biến cục bộ chưa được khởi tạo) và đặtco_varnames[var_num]thànhNULL.Added in version 3.12.
- STORE_FAST(var_num)¶
Lưu trữ
STACK.pop()vàoco_varnames[var_num]cục bộ.
- STORE_FAST_STORE_FAST(var_nums)¶
Lưu trữ
STACK[-1]vàoco_varnames[var_nums >> 4]vàSTACK[-2]vàoco_varnames[var_nums & 15].Added in version 3.13.
- STORE_FAST_LOAD_FAST(var_nums)¶
Lưu trữ
STACK.pop()vàoco_varnames[var_nums >> 4]cục bộ và đẩy tham chiếu đếnco_varnames[var_nums & 15]cục bộ vào ngăn xếp.Added in version 3.13.
- DELETE_FAST(var_num)¶
Xóa
co_varnames[var_num]cục bộ.
- MAKE_CELL(i)¶
Tạo một ô mới trong slot
i. Nếu vị trí đó không trống thì giá trị đó sẽ được lưu vào ô mới.Added in version 3.11.
- LOAD_DEREF(i)¶
Tải ô chứa trong khe
icủa bộ lưu trữ "cục bộ nhanh". Đẩy một tham chiếu đến đối tượng mà ô chứa trên ngăn xếp.Thay đổi trong phiên bản 3.11:
ikhông còn được bù đắp bằng độ dài củaco_varnames.
- LOAD_FROM_DICT_OR_DEREF(i)¶
Bật một ánh xạ ra khỏi ngăn xếp và tra cứu tên được liên kết với vị trí
icủa bộ lưu trữ "cục bộ nhanh" trong ánh xạ này. Nếu không tìm thấy tên ở đó, hãy tải tên đó từ ô chứa trong khei, tương tự nhưLOAD_DEREF. Điều này được sử dụng để tải closure variables trong các thân lớp (trước đây đã sử dụngLOAD_CLASSDEREF) và trong annotation scopes trong các thân lớp.Added in version 3.12.
- STORE_DEREF(i)¶
Lưu trữ
STACK.pop()vào ô chứa trong kheicủa bộ lưu trữ "cục bộ nhanh".Thay đổi trong phiên bản 3.11:
ikhông còn được bù đắp bằng độ dài củaco_varnames.
- DELETE_DEREF(i)¶
Làm trống ô chứa trong khe
icủa bộ lưu trữ "cục bộ nhanh". Được sử dụng bởi câu lệnhdel.Added in version 3.2.
Thay đổi trong phiên bản 3.11:
ikhông còn được bù đắp bằng độ dài củaco_varnames.
- COPY_FREE_VARS(n)¶
Sao chép
nfree (closure) variables từ phần đóng vào khung. Loại bỏ sự cần thiết của mã đặc biệt ở phía người gọi khi gọi các lần đóng.Added in version 3.11.
- RAISE_VARARGS(argc)¶
Đưa ra một ngoại lệ bằng cách sử dụng một trong 3 dạng của câu lệnh
raise, tùy thuộc vào giá trị của argc:0:
raise(tăng lại ngoại lệ trước đó)1:
raise STACK[-1](tăng trường hợp ngoại lệ hoặc nhập vàoSTACK[-1])2:
raise STACK[-2] from STACK[-1](tăng trường hợp ngoại lệ hoặc nhậpSTACK[-2]với__cause__được đặt thànhSTACK[-1])
- CALL(argc)¶
Gọi một đối tượng có thể gọi được với số lượng đối số được chỉ định bởi
argc. Trên ngăn xếp có (theo thứ tự tăng dần):Có thể gọi được
selfhoặcNULLCác đối số vị trí còn lại
argclà tổng số đối số vị trí, không bao gồmself.CALLđưa tất cả các đối số và đối tượng có thể gọi ra khỏi ngăn xếp, gọi đối tượng có thể gọi bằng các đối số đó và đẩy giá trị trả về do đối tượng có thể gọi trả về.Added in version 3.11.
Thay đổi trong phiên bản 3.13: Bây giờ có thể gọi được luôn xuất hiện ở cùng một vị trí trên ngăn xếp.
Thay đổi trong phiên bản 3.13: Các cuộc gọi có đối số từ khóa hiện được
CALL_KWxử lý.
- CALL_KW(argc)¶
Gọi một đối tượng có thể gọi được với số lượng đối số được chỉ định bởi
argc, bao gồm một hoặc nhiều đối số được đặt tên. Trên ngăn xếp có (theo thứ tự tăng dần):Có thể gọi được
selfhoặcNULLCác đối số vị trí còn lại
Các đối số được đặt tên
Một loạt tên đối số từ khóa
argclà tổng số đối số vị trí và được đặt tên, ngoại trừself. Độ dài của bộ tên đối số từ khóa là số đối số được đặt tên.CALL_KWbật tất cả các đối số, tên từ khóa và đối tượng có thể gọi ra khỏi ngăn xếp, gọi đối tượng có thể gọi bằng các đối số đó và đẩy giá trị trả về được đối tượng có thể gọi trả về.Added in version 3.13.
- CALL_FUNCTION_EX(flags)¶
Gọi một đối tượng có thể gọi được với tập hợp các đối số từ khóa và vị trí có thể thay đổi. Nếu bit thấp nhất của flags được đặt thì phần trên cùng của ngăn xếp chứa đối tượng ánh xạ chứa các đối số từ khóa bổ sung. Trước khi gọi được, đối tượng ánh xạ và đối tượng có thể lặp đều được "giải nén" và nội dung của chúng được chuyển vào dưới dạng đối số từ khóa và vị trí tương ứng.
CALL_FUNCTION_EXđưa tất cả các đối số và đối tượng có thể gọi ra khỏi ngăn xếp, gọi đối tượng có thể gọi bằng các đối số đó và đẩy giá trị trả về do đối tượng có thể gọi trả về.Added in version 3.6.
- PUSH_NULL¶
Đẩy một
NULLvào ngăn xếp. Được sử dụng trong chuỗi cuộc gọi để khớp vớiNULLđượcLOAD_METHODđẩy cho các cuộc gọi không theo phương thức.Added in version 3.11.
- MAKE_FUNCTION¶
Đẩy một đối tượng hàm mới vào ngăn xếp được xây dựng từ đối tượng mã tại
STACK[-1].Thay đổi trong phiên bản 3.10: Giá trị cờ
0x04là một bộ chuỗi thay vì từ điểnThay đổi trong phiên bản 3.11: Tên đủ điều kiện tại
STACK[-1]đã bị xóa.Thay đổi trong phiên bản 3.13: Các thuộc tính chức năng bổ sung trên ngăn xếp, được báo hiệu bằng cờ oparg, đã bị xóa. Bây giờ họ sử dụng
SET_FUNCTION_ATTRIBUTE.
- SET_FUNCTION_ATTRIBUTE(flag)¶
Đặt một thuộc tính trên một đối tượng hàm. Yêu cầu hàm ở
STACK[-1]và giá trị thuộc tính được đặt ởSTACK[-2]; tiêu thụ cả hai và rời khỏi chức năng ởSTACK[-1]. Cờ xác định thuộc tính nào cần đặt:0x01một bộ giá trị mặc định cho các tham số chỉ vị trí và tham số vị trí hoặc từ khóa theo thứ tự vị trí0x02từ điển các giá trị mặc định của tham số chỉ từ khóa0x04một bộ chuỗi chứa chú thích của tham số0x08một bộ chứa các ô cho các biến tự do, tạo ra một bao đóng0x10annotate function cho đối tượng hàm
Added in version 3.13.
Thay đổi trong phiên bản 3.14: Đã thêm
0x10để biểu thị chức năng chú thích cho đối tượng hàm.
- BUILD_SLICE(argc)¶
Đẩy một đối tượng lát vào ngăn xếp. argc phải là 2 hoặc 3. Nếu là 2, thực hiện:
kết thúc = STACK.pop() bắt đầu = STACK.pop() STACK.append(lát(bắt đầu, kết thúc))
nếu là 3, thực hiện
bước = STACK.pop() kết thúc = STACK.pop() bắt đầu = STACK.pop() STACK.append(lát(bắt đầu, kết thúc, bước))
Xem chức năng tích hợp
slice()để biết thêm thông tin.
- EXTENDED_ARG(ext)¶
Tiền tố bất kỳ opcode nào có đối số quá lớn để vừa với một byte mặc định. ext giữ một byte bổ sung hoạt động như các bit cao hơn trong đối số. Đối với mỗi opcode, cho phép tối đa ba
EXTENDED_ARGtiền tố, tạo thành một đối số từ hai byte đến bốn byte.
- CONVERT_VALUE(oparg)¶
Chuyển đổi giá trị thành chuỗi, tùy thuộc vào
oparg:giá trị = STACK.pop() kết quả = func(giá trị) STACK.append(kết quả)
oparg == 1: gọistr()trên valueoparg == 2: gọirepr()trên valueoparg == 3: gọiascii()trên value
Được sử dụng để triển khai các chuỗi ký tự được định dạng (chuỗi f).
Added in version 3.13.
- FORMAT_SIMPLE¶
Định dạng giá trị trên đầu ngăn xếp:
giá trị = STACK.pop() kết quả = value.__format__("") STACK.append(kết quả)
Được sử dụng để triển khai các chuỗi ký tự được định dạng (chuỗi f).
Added in version 3.13.
- FORMAT_WITH_SPEC¶
Định dạng giá trị đã cho với thông số định dạng đã cho:
thông số kỹ thuật = STACK.pop() giá trị = STACK.pop() kết quả = value.__format__(spec) STACK.append(kết quả)
Được sử dụng để triển khai các chuỗi ký tự được định dạng (chuỗi f).
Added in version 3.13.
- MATCH_CLASS(count)¶
STACK[-1]là một bộ tên thuộc tính từ khóa,STACK[-2]là lớp được đối sánh vàSTACK[-3]là chủ đề đối sánh. count là số lượng mẫu phụ vị trí.Bật
STACK[-1],STACK[-2]vàSTACK[-3]. NếuSTACK[-3]là một phiên bản củaSTACK[-2]và có các thuộc tính vị trí và từ khóa được yêu cầu bởi count vàSTACK[-1], hãy đẩy một bộ thuộc tính được trích xuất. Nếu không, hãy nhấnNone.Added in version 3.10.
Thay đổi trong phiên bản 3.11: Trước đây, lệnh này cũng đẩy một giá trị boolean biểu thị thành công (
True) hoặc thất bại (False).
- RESUME(context)¶
Không được. Thực hiện kiểm tra theo dõi, gỡ lỗi và tối ưu hóa nội bộ.
Toán hạng
contextbao gồm hai phần. Hai bit thấp nhất cho biết vị trí xảy raRESUME:0Sự khởi đầu của một hàm, không phải là trình tạo, coroutine hay trình tạo không đồng bộ1Sau biểu thứcyield2Sau biểu thứcyield from3Sau biểu thứcawait
Bit tiếp theo là
1nếu RESUME ở độ sâu ngoại trừ1và0nếu ngược lại.Added in version 3.11.
Thay đổi trong phiên bản 3.13: Giá trị oparg đã thay đổi để bao gồm thông tin về độ sâu ngoại trừ
- RETURN_GENERATOR¶
Tạo trình tạo, coroutine hoặc trình tạo không đồng bộ từ khung hiện tại. Được sử dụng làm mã hoạt động đầu tiên của đối tượng mã cho các lệnh gọi được đề cập ở trên. Xóa khung hiện tại và trả về trình tạo mới được tạo.
Added in version 3.11.
- SEND(delta)¶
Tương đương với
STACK[-1] = STACK[-2].send(STACK[-1]). Được sử dụng trong câu lệnhyield fromvàawait.Nếu lệnh gọi tăng
StopIteration, hãy bật giá trị trên cùng từ ngăn xếp, đẩy thuộc tínhvaluecủa ngoại lệ và tăng bộ đếm mã byte lên delta.Added in version 3.11.
- HAVE_ARGUMENT¶
Đây thực sự không phải là một opcode. Nó xác định đường phân chia giữa các opcode trong phạm vi [0,255] không sử dụng đối số của chúng và các opcode sử dụng (
< HAVE_ARGUMENTvà>= HAVE_ARGUMENT, tương ứng).Nếu ứng dụng của bạn sử dụng hướng dẫn giả hoặc hướng dẫn chuyên biệt, thay vào đó hãy sử dụng bộ sưu tập
hasarg.Thay đổi trong phiên bản 3.6: Bây giờ mọi lệnh đều có một đối số, nhưng các opcode
< HAVE_ARGUMENTbỏ qua nó. Trước đây, chỉ có opcode>= HAVE_ARGUMENTmới có đối số.Thay đổi trong phiên bản 3.12: Các lệnh giả đã được thêm vào mô-đun
disvà đối với chúng, việc so sánh vớiHAVE_ARGUMENTcho biết liệu chúng có sử dụng đối số của mình hay không là không đúng.Sắp loại bỏ từ phiên bản 3.13: Thay vào đó hãy sử dụng
hasarg.
- CALL_INTRINSIC_1¶
Gọi một hàm nội tại với một đối số. Truyền
STACK[-1]làm đối số và đặtSTACK[-1]cho kết quả. Được sử dụng để triển khai chức năng không quan trọng về hiệu suất.Toán hạng xác định hàm nội tại nào được gọi:
toán hạng
Mô tả
INTRINSIC_1_INVALIDKhông hợp lệ
INTRINSIC_PRINTIn đối số theo tiêu chuẩn. Được sử dụng trong REPL.
INTRINSIC_IMPORT_STARThực hiện
import *cho mô-đun được đặt tên.INTRINSIC_STOPITERATION_ERRORTrích xuất giá trị trả về từ ngoại lệ
StopIteration.INTRINSIC_ASYNC_GEN_WRAPBao bọc một giá trị trình tạo không đồng bộ
INTRINSIC_UNARY_POSITIVEThực hiện thao tác
+đơn nhấtINTRINSIC_LIST_TO_TUPLEChuyển đổi một danh sách thành một bộ dữ liệu
INTRINSIC_TYPEVARTạo một
typing.TypeVarINTRINSIC_PARAMSPECTạo một
typing.ParamSpecINTRINSIC_TYPEVARTUPLETạo một
typing.TypeVarTupleINTRINSIC_SUBSCRIPT_GENERICTrả về
typing.Genericđược đăng ký với đối sốINTRINSIC_TYPEALIASTạo một
typing.TypeAliasType; được sử dụng trong câu lệnhtype. Đối số là một bộ gồm tên, tham số loại và giá trị của bí danh loại.Added in version 3.12.
- CALL_INTRINSIC_2¶
Gọi một hàm nội tại với hai đối số. Được sử dụng để triển khai chức năng không quan trọng về hiệu suất:
arg2 = STACK.pop() arg1 = STACK.pop() kết quả = nội tại2(arg1, arg2) STACK.append(kết quả)
Toán hạng xác định hàm nội tại nào được gọi:
toán hạng
Mô tả
INTRINSIC_2_INVALIDKhông hợp lệ
INTRINSIC_PREP_RERAISE_STARTính toán
ExceptionGroupđể tăng từtry-except*.INTRINSIC_TYPEVAR_WITH_BOUNDTạo một
typing.TypeVarcó giới hạn.INTRINSIC_TYPEVAR_WITH_CONSTRAINTSTạo một
typing.TypeVarcó ràng buộc.INTRINSIC_SET_FUNCTION_TYPE_PARAMSĐặt thuộc tính
__type_params__của hàm.Added in version 3.12.
- LOAD_SPECIAL¶
Thực hiện tra cứu phương pháp đặc biệt trên
STACK[-1]. Nếutype(STACK[-1]).__xxx__là một phương thức, hãy đểtype(STACK[-1]).__xxx__; STACK[-1]trên ngăn xếp. Nếutype(STACK[-1]).__xxx__không phải là một phương thức, hãy đểSTACK[-1].__xxx__; NULLtrên ngăn xếp.Added in version 3.14.
Pseudo-instructions
Các mã opcode này không xuất hiện trong mã byte Python. Chúng được trình biên dịch sử dụng nhưng được thay thế bằng các mã opcode thực hoặc bị loại bỏ trước khi mã byte được tạo.
- SETUP_FINALLY(target)¶
Thiết lập trình xử lý ngoại lệ cho khối mã sau. Nếu xảy ra ngoại lệ, mức ngăn xếp giá trị sẽ được khôi phục về trạng thái hiện tại và quyền điều khiển được chuyển đến bộ xử lý ngoại lệ tại
target.
- SETUP_CLEANUP(target)¶
Giống như
SETUP_FINALLY, nhưng trong trường hợp ngoại lệ cũng đẩy lệnh cuối cùng (lasti) vào ngăn xếp đểRERAISEcó thể khôi phục lại. Nếu xảy ra ngoại lệ, mức ngăn xếp giá trị và lệnh cuối cùng trên khung sẽ được khôi phục về trạng thái hiện tại và điều khiển được chuyển đến bộ xử lý ngoại lệ tạitarget.
- SETUP_WITH(target)¶
Giống như
SETUP_CLEANUP, nhưng trong trường hợp có ngoại lệ, một mục nữa sẽ được lấy ra khỏi ngăn xếp trước khi quyền điều khiển được chuyển đến bộ xử lý ngoại lệ tạitarget.Biến thể này được sử dụng trong các cấu trúc
withvàasync with, đẩy giá trị trả về của__enter__()hoặc__aenter__()của trình quản lý bối cảnh vào ngăn xếp.
- POP_BLOCK¶
Đánh dấu sự kết thúc của khối mã được liên kết với
SETUP_FINALLY,SETUP_CLEANUPhoặcSETUP_WITHcuối cùng.
- LOAD_CONST_IMMORTAL(consti)¶
Hoạt động như
LOAD_CONST, nhưng hiệu quả hơn đối với các vật thể bất tử.
- JUMP¶
- JUMP_NO_INTERRUPT¶
Các lệnh nhảy tương đối không được định hướng được thay thế bằng các lệnh tương ứng có hướng (tiến/lùi) của chúng bởi trình biên dịch.
- JUMP_IF_TRUE¶
- JUMP_IF_FALSE¶
Bước nhảy có điều kiện không ảnh hưởng đến ngăn xếp. Thay thế bằng dãy
COPY 1,TO_BOOL,POP_JUMP_IF_TRUE/FALSE.
- LOAD_CLOSURE(i)¶
Đẩy một tham chiếu đến ô chứa trong khe
icủa bộ lưu trữ "cục bộ nhanh".Lưu ý rằng
LOAD_CLOSUREđược thay thế bằngLOAD_FASTtrong trình biên dịch mã.Thay đổi trong phiên bản 3.13: Opcode này bây giờ là một lệnh giả.
Bộ sưu tập mã opcode¶
Các bộ sưu tập này được cung cấp để tự động xem xét các hướng dẫn mã byte:
Thay đổi trong phiên bản 3.12: Các bộ sưu tập hiện nay cũng chứa các hướng dẫn giả và các hướng dẫn được thiết kế dựa trên công cụ. Đây là các opcode có giá trị >= MIN_PSEUDO_OPCODE và >= MIN_INSTRUMENTED_OPCODE.
- dis.opname¶
Trình tự các tên hoạt động, có thể lập chỉ mục bằng mã byte.
- dis.opmap¶
Tên hoạt động ánh xạ từ điển thành mã byte.
- dis.cmp_op¶
Trình tự của tất cả các tên hoạt động so sánh.
- dis.hasarg¶
Chuỗi mã byte sử dụng đối số của chúng.
Added in version 3.12.
- dis.hasconst¶
Chuỗi mã byte truy cập vào một hằng số.
- dis.hasfree¶
Chuỗi mã byte truy cập vào free (closure) variable. 'miễn phí' trong ngữ cảnh này đề cập đến các tên trong phạm vi hiện tại được tham chiếu bởi phạm vi bên trong hoặc tên trong phạm vi bên ngoài được tham chiếu từ phạm vi này. Nó not bao gồm các tham chiếu đến phạm vi toàn cầu hoặc phạm vi dựng sẵn.
- dis.hasname¶
Chuỗi mã byte truy cập vào một thuộc tính theo tên.
- dis.hasjump¶
Chuỗi mã byte có mục tiêu nhảy. Tất cả các bước nhảy đều là tương đối.
Added in version 3.13.
- dis.haslocal¶
Chuỗi mã byte truy cập vào một biến cục bộ.
- dis.hascompare¶
Chuỗi mã byte của các phép toán Boolean.
- dis.hasexc¶
Chuỗi mã byte đặt trình xử lý ngoại lệ.
Added in version 3.12.
- dis.hasjrel¶
Chuỗi mã byte có mục tiêu nhảy tương đối.
Sắp loại bỏ từ phiên bản 3.13: Tất cả các bước nhảy bây giờ là tương đối. Sử dụng
hasjump.
- dis.hasjabs¶
Chuỗi mã byte có mục tiêu nhảy tuyệt đối.
Sắp loại bỏ từ phiên bản 3.13: Tất cả các bước nhảy bây giờ là tương đối. Danh sách này trống.