dis
— 파이썬 바이트 코드 역 어셈블러¶
소스 코드: Lib/dis.py
dis
모듈은 CPython 바이트 코드를 역 어셈블 하여 분석을 지원합니다. 이 모듈이 입력으로 취하는 CPython 바이트 코드는 파일 Include/opcode.h
에 정의되어 있으며 컴파일러와 인터프리터에서 사용됩니다.
CPython 구현 상세: 바이트 코드는 CPython 인터프리터의 구현 세부 사항입니다. 파이썬 버전 간에 바이트 코드가 추가, 제거 또는 변경되지 않을 것이라는 보장은 없습니다. 이 모듈을 사용하는 것이 파이썬 VM이나 파이썬 릴리스에 걸쳐 작동할 것으로 생각하지 말아야 합니다.
버전 3.6에서 변경: 명령어마다 2바이트를 사용합니다. 이전에는 바이트 수가 명령어에 따라 달랐습니다.
버전 3.10에서 변경: The argument of jump, exception handling and loop instructions is now the instruction offset rather than the byte offset.
예: 주어진 함수 myfunc()
에 대해:
def myfunc(alist):
return len(alist)
다음 명령을 사용하여 myfunc()
의 역 어셈블리를 표시할 수 있습니다:
>>> dis.dis(myfunc)
2 0 LOAD_GLOBAL 0 (len)
2 LOAD_FAST 0 (alist)
4 CALL_FUNCTION 1
6 RETURN_VALUE
(“2”는 줄 번호입니다).
바이트 코드 분석¶
버전 3.4에 추가.
바이트 코드 분석 API는 컴파일된 코드의 세부 사항에 쉽게 액세스 할 수 있도록 하는 Bytecode
객체로 파이썬 코드 조각을 감쌀 수 있도록 합니다.
-
class
dis.
Bytecode
(x, *, first_line=None, current_offset=None)¶ 함수, 제너레이터, 비동기 제너레이터, 코루틴, 메서드, 소스 코드 문자열 또는 (
compile()
에서 반환된) 코드 객체에 해당하는 바이트 코드를 분석합니다.이것은 아래에 나열된 많은 함수, 특히
get_instructions()
를 둘러싼 편리한 래퍼입니다,Bytecode
인스턴스를 이터레이트 하면 바이트 코드 연산이Instruction
인스턴스로 산출되기 때문입니다.first_line이
None
이 아니면, 역 어셈블 된 코드에서 첫 번째 소스 줄에 대해 보고해야 하는 줄 번호를 나타냅니다. 그렇지 않으면, 소스 줄 정보(있다면)를 역 어셈블 된 코드 객체에서 직접 취합니다.current_offset이
None
이 아니면, 역 어셈블 된 코드의 명령어 오프셋을 나타냅니다. 이를 설정하면,dis()
가 지정된 옵코드(opcode)에 대해 “현재 명령어” 마커를 표시합니다.-
classmethod
from_traceback
(tb)¶ 주어진 트레이스백에서
Bytecode
인스턴스를 구성하고, current_offset을 예외를 일으킨 명령어로 설정합니다.
-
codeobj
¶ 컴파일된 코드 객체.
-
first_line
¶ 코드 객체의 첫 번째 소스 줄 (사용 가능하다면)
-
info
()¶ code_info()
처럼, 코드 객체에 대한 자세한 정보가 포함된 포맷된 여러 줄 문자열을 반환합니다.
버전 3.7에서 변경: 이제 코루틴과 비동기 제너레이터 객체를 처리할 수 있습니다.
-
classmethod
예:
>>> bytecode = dis.Bytecode(myfunc)
>>> for instr in bytecode:
... print(instr.opname)
...
LOAD_GLOBAL
LOAD_FAST
CALL_FUNCTION
RETURN_VALUE
분석 함수¶
dis
모듈은 또한 입력을 원하는 출력으로 직접 변환하는 다음 분석 함수를 정의합니다. 단일 작업만 수행해서, 중간 분석 객체가 유용하지 않을 때 유용할 수 있습니다:
-
dis.
code_info
(x)¶ 제공된 함수, 제너레이터, 비동기 제너레이터, 코루틴, 메서드, 소스 코드 문자열 또는 코드 객체에 대한 자세한 코드 객체 정보가 포함된 포맷된 여러 줄 문자열을 반환합니다.
코드 정보 문자열의 정확한 내용은 구현에 따라 달라지며 파이썬 VM이나 파이썬 릴리스에 걸쳐 임의로 변경될 수 있습니다.
버전 3.2에 추가.
버전 3.7에서 변경: 이제 코루틴과 비동기 제너레이터 객체를 처리할 수 있습니다.
-
dis.
show_code
(x, *, file=None)¶ 제공된 함수, 메서드, 소스 코드 문자열 또는 코드 객체에 대한 자세한 코드 객체 정보를 file(또는 file이 지정되지 않으면
sys.stdout
)로 인쇄합니다.이것은
print(code_info(x), file=file)
의 편리한 축약 형으로, 인터프리터 프롬프트에서의 대화식 탐색을 위한 것입니다.버전 3.2에 추가.
버전 3.4에서 변경: file 매개 변수를 추가했습니다.
-
dis.
dis
(x=None, *, file=None, depth=None)¶ x 객체를 역 어셈블 합니다. x는 모듈, 클래스, 메서드, 함수, 제너레이터, 비동기 제너레이터, 코루틴, 코드 객체, 소스 코드 문자열 또는 원시 바이트 코드의 바이트 시퀀스를 나타낼 수 있습니다. 모듈의 경우, 모든 함수를 역 어셈블 합니다. 클래스의 경우, 모든 메서드(클래스와 정적 메서드를 포함합니다)를 역 어셈블 합니다. 코드 객체나 원시 바이트 코드 시퀀스의 경우, 바이트 코드 명령어 당 한 줄을 인쇄합니다. 또한 중첩 코드 객체(컴프리헨션, 제너레이터 표현식 및 중첩 함수의 코드와 중첩 클래스를 만드는 데 사용된 코드)를 재귀적으로 역 어셈블 합니다. 문자열은 역 어셈블 되기 전에 먼저
compile()
내장 함수를 사용하여 코드 객체로 컴파일됩니다. 객체가 제공되지 않으면, 이 함수는 마지막 트레이스백을 역 어셈블 합니다.역 어셈블리는 제공된다면 제공된 file 인자에, 그렇지 않으면
sys.stdout
에 텍스트로 기록됩니다.재귀의 최대 깊이는
None
이 아닌 한 depth에 의해 제한됩니다.depth=0
은 재귀가 없음을 의미합니다.버전 3.4에서 변경: file 매개 변수를 추가했습니다.
버전 3.7에서 변경: 재귀 역 어셈블을 구현하고 depth 매개 변수를 추가했습니다.
버전 3.7에서 변경: 이제 코루틴과 비동기 제너레이터 객체를 처리할 수 있습니다.
-
dis.
distb
(tb=None, *, file=None)¶ 트레이스백의 최상단 함수를 역 어셈블 합니다. 전달되지 않으면 마지막 트레이스백을 사용합니다. 예외를 일으키는 명령어가 표시됩니다.
역 어셈블리는 제공된다면 제공된 file 인자에, 그렇지 않으면
sys.stdout
에 텍스트로 기록됩니다.버전 3.4에서 변경: file 매개 변수를 추가했습니다.
-
dis.
disassemble
(code, lasti=- 1, *, file=None)¶ -
dis.
disco
(code, lasti=- 1, *, file=None)¶ 코드 객체를 역 어셈블 하고, lasti가 제공되면 마지막 명령어를 표시합니다. 출력은 다음 열로 나뉩니다:
줄 번호, 각 줄의 첫 번째 명령어에 표시됩니다
현재 명령어,
-->
로 표시됩니다,레이블이 있는 명령어,
>>
로 표시됩니다,명령어의 주소,
연산 코드 이름,
연산 매개 변수, 그리고
괄호 안에 있는 매개 변수의 해석.
매개 변수 해석은 지역과 전역 변수 이름, 상숫값, 분기 대상 및 비교 연산자를 인식합니다.
역 어셈블리는 제공된다면 제공된 file 인자에, 그렇지 않으면
sys.stdout
에 텍스트로 기록됩니다.버전 3.4에서 변경: file 매개 변수를 추가했습니다.
-
dis.
get_instructions
(x, *, first_line=None)¶ 제공된 함수, 메서드, 소스 코드 문자열 또는 코드 객체의 명령어들에 대한 이터레이터를 반환합니다.
이터레이터는 제공된 코드의 각 연산에 대한 세부 정보를 제공하는
Instruction
네임드 튜플의 연속을 생성합니다.first_line이
None
이 아니면, 역 어셈블 된 코드에서 첫 번째 소스 줄에 대해 보고해야 하는 줄 번호를 나타냅니다. 그렇지 않으면, 소스 줄 정보(있다면)를 역 어셈블 된 코드 객체에서 직접 취합니다.버전 3.4에 추가.
-
dis.
findlinestarts
(code)¶ This generator function uses the
co_lines
method of the code object code to find the offsets which are starts of lines in the source code. They are generated as(offset, lineno)
pairs.버전 3.6에서 변경: 줄 번호가 줄어들 수 있습니다. 전에는, 언제나 증가했습니다.
버전 3.10에서 변경: The PEP 626
co_lines
method is used instead of theco_firstlineno
andco_lnotab
attributes of the code object.
-
dis.
findlabels
(code)¶ 원시 컴파일된 바이트 코드 문자열 code에서 점프 대상인 모든 오프셋을 감지하고, 이러한 오프셋의 리스트를 반환합니다.
-
dis.
stack_effect
(opcode, oparg=None, *, jump=None)¶ 인자 oparg를 갖는 opcode의 스택 효과를 계산합니다.
코드에 점프 대상이 있고 jump가
True
이면,stack_effect()
는 점프의 스택 효과를 반환합니다. jump가False
이면, 점프하지 않는 스택 효과를 반환합니다. jump가None
(기본값)이면, 두 경우의 최대 스택 효과를 반환합니다.버전 3.4에 추가.
버전 3.8에서 변경: jump 매개 변수를 추가했습니다.
파이썬 바이트 코드 명령어¶
get_instructions()
함수와 Bytecode
클래스는 바이트 코드 명령어의 세부 사항을 Instruction
인스턴스로 제공합니다:
-
class
dis.
Instruction
¶ 바이트 코드 연산에 대한 세부 사항
-
opname
¶ 연산의 사람이 읽을 수 있는 이름
-
arg
¶ 연산에 대한 숫자 인자 (있다면), 그렇지 않으면
None
-
argval
¶ 해석된(resolved) arg 값 (알고 있다면), 그렇지 않으면 arg와 같습니다
-
argrepr
¶ 연산 인자에 대한 사람이 읽을 수 있는 설명
-
offset
¶ 바이트 코드 시퀀스 내에서 연산의 시작 인덱스
-
starts_line
¶ 이 옵코드에 의해 시작된 줄 (있다면), 그렇지 않으면
None
-
is_jump_target
¶ 다른 코드가 여기로 점프하면
True
, 그렇지 않으면False
버전 3.4에 추가.
-
파이썬 컴파일러는 현재 다음 바이트 코드 명령어를 생성합니다.
일반 명령어
-
NOP
¶ 아무것도 하지 않는 코드. 바이트 코드 최적화기에서 자리 표시자로 사용됩니다.
-
POP_TOP
¶ 스택 최상단 (TOS) 항목을 제거합니다.
-
ROT_TWO
¶ 두 개의 최상위 스택 항목을 자리바꿈합니다.
-
ROT_THREE
¶ 두 번째와 세 번째 스택 항목을 한 자리 위로 들어 올리고, 최상단 항목을 세 번째 자리로 내립니다.
-
ROT_FOUR
¶ 두 번째, 세 번째 및 네 번째 스택 항목을 한 자리 위로 들어 올리고, 최상단 항목을 네 번째 자리로 내립니다.
버전 3.8에 추가.
-
DUP_TOP
¶ 스택 최상단의 참조를 복제합니다.
버전 3.2에 추가.
-
DUP_TOP_TWO
¶ 같은 순서를 유지하면서, 스택 최상단의 두 참조를 복제합니다.
버전 3.2에 추가.
단항 연산
단항 연산은 스택의 최상단을 취하고, 연산을 적용한 다음, 결과를 스택에 다시 푸시합니다.
-
UNARY_POSITIVE
¶ TOS = +TOS
를 구현합니다.
-
UNARY_NEGATIVE
¶ TOS = -TOS
를 구현합니다.
-
UNARY_NOT
¶ TOS = not TOS
를 구현합니다.
-
UNARY_INVERT
¶ TOS = ~TOS
를 구현합니다.
-
GET_ITER
¶ TOS = iter(TOS)
를 구현합니다.
-
GET_YIELD_FROM_ITER
¶ TOS
가 제너레이터 이터레이터나 코루틴 객체이면 그대로 둡니다. 그렇지 않으면,TOS = iter(TOS)
를 구현합니다.버전 3.5에 추가.
이항 연산
이항 연산은 스택에서 스택 최상단(TOS)과 두 번째 최상단 스택 항목(TOS1)을 제거합니다. 연산을 수행하고, 결과를 다시 스택에 넣습니다.
-
BINARY_POWER
¶ TOS = TOS1 ** TOS
를 구현합니다.
-
BINARY_MULTIPLY
¶ TOS = TOS1 * TOS
를 구현합니다.
-
BINARY_MATRIX_MULTIPLY
¶ TOS = TOS1 @ TOS
를 구현합니다.버전 3.5에 추가.
-
BINARY_FLOOR_DIVIDE
¶ TOS = TOS1 // TOS
를 구현합니다.
-
BINARY_TRUE_DIVIDE
¶ TOS = TOS1 / TOS
를 구현합니다.
-
BINARY_MODULO
¶ TOS = TOS1 % TOS
를 구현합니다.
-
BINARY_ADD
¶ TOS = TOS1 + TOS
를 구현합니다.
-
BINARY_SUBTRACT
¶ TOS = TOS1 - TOS
를 구현합니다.
-
BINARY_SUBSCR
¶ TOS = TOS1[TOS]
를 구현합니다.
-
BINARY_LSHIFT
¶ TOS = TOS1 << TOS
를 구현합니다.
-
BINARY_RSHIFT
¶ TOS = TOS1 >> TOS
를 구현합니다.
-
BINARY_AND
¶ TOS = TOS1 & TOS
를 구현합니다.
-
BINARY_XOR
¶ TOS = TOS1 ^ TOS
를 구현합니다.
-
BINARY_OR
¶ TOS = TOS1 | TOS
를 구현합니다.
제자리 연산
제자리(in-place) 연산은 TOS와 TOS1을 제거하고, 스택에 결과를 다시 푸시한다는 점에서 이항 연산과 같습니다. 그러나 TOS1이 이를 지원하면 연산이 제자리에서 수행되며, 결과 TOS는 원래 TOS1일 수 있습니다 (하지만 꼭 그럴 필요는 없습니다).
-
INPLACE_POWER
¶ 제자리
TOS = TOS1 ** TOS
를 구현합니다.
-
INPLACE_MULTIPLY
¶ 제자리
TOS = TOS1 * TOS
를 구현합니다.
-
INPLACE_MATRIX_MULTIPLY
¶ 제자리
TOS = TOS1 @ TOS
를 구현합니다.버전 3.5에 추가.
-
INPLACE_FLOOR_DIVIDE
¶ 제자리
TOS = TOS1 // TOS
를 구현합니다.
-
INPLACE_TRUE_DIVIDE
¶ 제자리
TOS = TOS1 / TOS
를 구현합니다.
-
INPLACE_MODULO
¶ 제자리
TOS = TOS1 % TOS
를 구현합니다.
-
INPLACE_ADD
¶ 제자리
TOS = TOS1 + TOS
를 구현합니다.
-
INPLACE_SUBTRACT
¶ 제자리
TOS = TOS1 - TOS
를 구현합니다.
-
INPLACE_LSHIFT
¶ 제자리
TOS = TOS1 << TOS
를 구현합니다.
-
INPLACE_RSHIFT
¶ 제자리
TOS = TOS1 >> TOS
를 구현합니다.
-
INPLACE_AND
¶ 제자리
TOS = TOS1 & TOS
를 구현합니다.
-
INPLACE_XOR
¶ 제자리
TOS = TOS1 ^ TOS
를 구현합니다.
-
INPLACE_OR
¶ 제자리
TOS = TOS1 | TOS
를 구현합니다.
-
STORE_SUBSCR
¶ TOS1[TOS] = TOS2
를 구현합니다.
-
DELETE_SUBSCR
¶ del TOS1[TOS]
를 구현합니다.
코루틴 옵코드
-
GET_AWAITABLE
¶ TOS = get_awaitable(TOS)
를 구현합니다. 여기서o
가 코루틴 객체나 CO_ITERABLE_COROUTINE 플래그를 가진 제너레이터 객체이면get_awaitable(o)
는o
를 반환합니다, 또는o.__await__
를 해석(resolve)합니다.버전 3.5에 추가.
-
GET_AITER
¶ TOS = TOS.__aiter__()
를 구현합니다.버전 3.5에 추가.
버전 3.7에서 변경:
__aiter__
로부터 어웨이터블 객체를 반환하는 것은 더는 지원되지 않습니다.
-
GET_ANEXT
¶ Pushes
get_awaitable(TOS.__anext__())
to the stack. SeeGET_AWAITABLE
for details aboutget_awaitable
.버전 3.5에 추가.
-
END_ASYNC_FOR
¶ async for
루프를 종료합니다. 다음 항목을 어웨이트 할 때 발생하는 예외를 처리합니다. TOS가StopAsyncIteration
이면 스택에서 7개의 값을 팝하고 두 번째 세 개를 사용하여 예외 상태를 복원합니다. 그렇지 않으면 스택에서 세 값을 사용하여 예외를 다시 발생시킵니다. 예외 처리기 블록이 블록 스택에서 제거됩니다.버전 3.8에 추가.
-
BEFORE_ASYNC_WITH
¶ 스택 최상단의 객체에서
__aenter__
와__aexit__
를 해석(resolve)합니다.__aexit__
와__aenter__()
의 결과를 스택으로 푸시합니다.버전 3.5에 추가.
-
SETUP_ASYNC_WITH
¶ 새 프레임 객체를 만듭니다.
버전 3.5에 추가.
기타 옵코드
-
SET_ADD
(i)¶ set.add(TOS1[-i], TOS)
를 호출합니다. 집합 컴프리헨션을 구현하는 데 사용됩니다.
-
LIST_APPEND
(i)¶ list.append(TOS1[-i], TOS)
를 호출합니다. 리스트 컴프리헨션을 구현하는 데 사용됩니다.
-
MAP_ADD
(i)¶ dict.__setitem__(TOS1[-i], TOS1, TOS)
를 호출합니다. 딕셔너리 컴프리헨션을 구현하는 데 사용됩니다.버전 3.1에 추가.
버전 3.8에서 변경: 맵 값은 TOS이고 맵 키는 TOS1입니다. 전에는, 이것들이 반대였습니다.
모든 SET_ADD
, LIST_APPEND
및 MAP_ADD
명령어에 대해, 추가된 값이나 키/값 쌍이 팝 되지만, 컨테이너 객체는 스택에 남아 있어서 루프의 추가 이터레이션에 사용할 수 있습니다.
-
RETURN_VALUE
¶ TOS를 함수 호출자에게 반환합니다.
-
SETUP_ANNOTATIONS
¶ locals()
에__annotations__
가 정의되어 있는지 확인합니다, 그렇지 않으면 비어있는dict
로 설정됩니다. 이 옵코드는 클래스나 모듈 본문에 변수 어노테이션이 정적으로 포함될 때만 생성됩니다.버전 3.6에 추가.
-
IMPORT_STAR
¶ '_'
로 시작하지 않는 모든 심볼을 모듈 TOS에서 지역 이름 공간으로 직접 로드합니다. 모든 이름을 로드한 후 모듈이 팝 됩니다. 이 옵코드는from module import *
를 구현합니다.
-
POP_EXCEPT
¶ 블록 스택에서 하나의 블록을 제거합니다. 팝 된 블록은 예외 처리기에 진입할 때 묵시적으로 만들어진 예외 처리기 블록이어야 합니다. 프레임 스택에서 추가적인 값들을 팝 하는 것에 더해, 마지막 3개의 팝 된 값이 예외 상태를 복원하는 데 사용됩니다.
-
RERAISE
¶ Re-raises the exception currently on top of the stack. If oparg is non-zero, restores
f_lasti
of the current frame to its value when the exception was raised.버전 3.9에 추가.
-
WITH_EXCEPT_START
¶ 스택의 최상위 3개 항목을 인자로 스택의 위치 7에 있는 함수를 호출합니다.
with
문에서 예외가 발생했을 때context_manager.__exit__(*exc_info())
호출을 구현하는 데 사용됩니다.버전 3.9에 추가.
-
LOAD_ASSERTION_ERROR
¶ AssertionError
를 스택으로 푸시합니다.assert
문에서 사용됩니다.버전 3.9에 추가.
-
LOAD_BUILD_CLASS
¶ builtins.__build_class__()
를 스택으로 푸시합니다. 나중에 클래스를 생성하기 위해CALL_FUNCTION
에 의해 호출됩니다.
-
SETUP_WITH
(delta)¶ This opcode performs several operations before a with block starts. First, it loads
__exit__()
from the context manager and pushes it onto the stack for later use byWITH_EXCEPT_START
. Then,__enter__()
is called, and a finally block pointing to delta is pushed. Finally, the result of calling the__enter__()
method is pushed onto the stack. The next opcode will either ignore it (POP_TOP
), or store it in (a) variable(s) (STORE_FAST
,STORE_NAME
, orUNPACK_SEQUENCE
).버전 3.2에 추가.
-
COPY_DICT_WITHOUT_KEYS
¶ TOS is a tuple of mapping keys, and TOS1 is the match subject. Replace TOS with a
dict
formed from the items of TOS1, but without any of the keys in TOS.버전 3.10에 추가.
-
GET_LEN
¶ Push
len(TOS)
onto the stack.버전 3.10에 추가.
-
MATCH_MAPPING
¶ If TOS is an instance of
collections.abc.Mapping
(or, more technically: if it has thePy_TPFLAGS_MAPPING
flag set in itstp_flags
), pushTrue
onto the stack. Otherwise, pushFalse
.버전 3.10에 추가.
-
MATCH_SEQUENCE
¶ If TOS is an instance of
collections.abc.Sequence
and is not an instance ofstr
/bytes
/bytearray
(or, more technically: if it has thePy_TPFLAGS_SEQUENCE
flag set in itstp_flags
), pushTrue
onto the stack. Otherwise, pushFalse
.버전 3.10에 추가.
-
MATCH_KEYS
¶ TOS is a tuple of mapping keys, and TOS1 is the match subject. If TOS1 contains all of the keys in TOS, push a
tuple
containing the corresponding values, followed byTrue
. Otherwise, pushNone
, followed byFalse
.버전 3.10에 추가.
다음 옵코드는 모두 인자를 사용합니다.
-
STORE_NAME
(namei)¶ name = TOS
를 구현합니다. namei는 코드 객체의co_names
어트리뷰트에서 name의 인덱스입니다. 컴파일러는 가능하면STORE_FAST
나STORE_GLOBAL
을 사용하려고 합니다.
-
DELETE_NAME
(namei)¶ del name
을 구현합니다. 여기서 namei는 코드 객체의co_names
어트리뷰트에서의 인덱스입니다.
-
UNPACK_SEQUENCE
(count)¶ TOS를 count 개 개별 값으로 언팩합니다. 이 값들은 오른쪽에서 왼쪽으로 스택에 넣습니다.
-
UNPACK_EX
(counts)¶ 스타드 타깃(starred target)으로의 대입을 구현합니다: TOS의 이터러블을 개별 값으로 언팩합니다. 여기서 값의 총수는 이터러블의 항목 수보다 적을 수 있습니다: 새 값 중 하나는 남은 모든 항목의 리스트입니다.
counts의 하위 바이트는 리스트값 이전의 값의 개수이고, counts의 상위 바이트는 그 이후의 값의 개수입니다. 결괏값들은 오른쪽에서 왼쪽으로 스택에 넣습니다.
-
STORE_ATTR
(namei)¶ TOS.name = TOS1
을 구현합니다. 여기서 namei는co_names
에서 name의 인덱스입니다.
-
DELETE_ATTR
(namei)¶ namei를
co_names
에서의 인덱스로 사용하여,del TOS.name
을 구현합니다.
-
STORE_GLOBAL
(namei)¶ STORE_NAME
처럼 작동하지만, 이름을 전역으로 저장합니다.
-
DELETE_GLOBAL
(namei)¶ DELETE_NAME
처럼 작동하지만, 전역 이름을 삭제합니다.
-
LOAD_CONST
(consti)¶ co_consts[consti]
를 스택으로 푸시합니다.
-
LOAD_NAME
(namei)¶ co_names[namei]
와 연관된 값을 스택으로 푸시합니다.
-
BUILD_TUPLE
(count)¶ 스택에서 count 개의 항목을 소비하는 튜플을 만들고, 결과 튜플을 스택으로 푸시합니다.
-
BUILD_LIST
(count)¶ BUILD_TUPLE
처럼 작동하지만, 리스트를 만듭니다.
-
BUILD_SET
(count)¶ BUILD_TUPLE
처럼 작동하지만, 집합을 만듭니다.
-
BUILD_MAP
(count)¶ 새 딕셔너리 객체를 스택으로 푸시합니다. 딕셔너리가 count 항목을 갖도록
2 * count
항목을 팝 합니다:{..., TOS3: TOS2, TOS1: TOS}
.버전 3.5에서 변경: 딕셔너리는 count 항목을 갖도록 미리 크기가 조정된 빈 딕셔너리를 만드는 대신 스택 항목에서 만들어집니다.
-
BUILD_CONST_KEY_MAP
(count)¶ 상수 키에 특화된
BUILD_MAP
버전. 키의 튜플이 포함된 스택의 맨 위 요소를 팝 한 다음,TOS1
에서 시작하여, count 개의 값을 팝 하여 만들어지는 딕셔너리의 값을 형성합니다.버전 3.6에 추가.
-
BUILD_STRING
(count)¶ 스택에서 count 문자열을 이어붙이고 결과 문자열을 스택으로 푸시합니다.
버전 3.6에 추가.
-
LIST_TO_TUPLE
¶ 스택에서 리스트를 팝하고 같은 값을 포함하는 튜플을 푸시합니다.
버전 3.9에 추가.
-
LIST_EXTEND
(i)¶ list.extend(TOS1[-i], TOS)
를 호출합니다. 리스트를 만드는 데 사용됩니다.버전 3.9에 추가.
-
SET_UPDATE
(i)¶ set.update(TOS1[-i], TOS)
를 호출합니다. 집합을 만드는 데 사용됩니다.버전 3.9에 추가.
-
DICT_UPDATE
(i)¶ dict.update(TOS1[-i], TOS)
를 호출합니다. 딕셔너리를 만드는 데 사용됩니다.버전 3.9에 추가.
-
DICT_MERGE
¶ DICT_UPDATE
와 유사하지만, 중복 키에 대해 예외를 발생시킵니다.버전 3.9에 추가.
-
LOAD_ATTR
(namei)¶ TOS를
getattr(TOS, co_names[namei])
로 바꿉니다.
-
COMPARE_OP
(opname)¶ 불리언 연산을 수행합니다. 연산 이름은
cmp_op[opname]
에서 찾을 수 있습니다.
-
IS_OP
(invert)¶ is
비교를 수행하거나,invert
가 1이면is not
을 수행합니다.버전 3.9에 추가.
-
CONTAINS_OP
(invert)¶ in
비교를 수행하거나,invert
가 1이면not in
을 수행합니다.버전 3.9에 추가.
-
IMPORT_NAME
(namei)¶ 모듈
co_names[namei]
를 임포트 합니다. TOS와 TOS1이 팝 되고__import__()
의 fromlist와 level 인자를 제공합니다. 모듈 객체가 스택으로 푸시 됩니다. 현재 이름 공간은 영향을 받지 않습니다: 올바른 import 문을 위해, 후속STORE_FAST
명령어가 이름 공간을 수정합니다.
-
IMPORT_FROM
(namei)¶ TOS에서 발견된 모듈에서 어트리뷰트
co_names[namei]
를 로드합니다. 결과 객체는 스택에 푸시 되어, 뒤따르는STORE_FAST
명령어로 저장됩니다.
-
JUMP_FORWARD
(delta)¶ 바이트 코드 카운터를 delta만큼 증가시킵니다.
-
POP_JUMP_IF_TRUE
(target)¶ TOS가 참이면, 바이트 코드 카운터를 target으로 설정합니다. TOS가 팝 됩니다.
버전 3.1에 추가.
-
POP_JUMP_IF_FALSE
(target)¶ TOS가 거짓이면, 바이트 코드 카운터를 target으로 설정합니다. TOS가 팝 됩니다.
버전 3.1에 추가.
-
JUMP_IF_NOT_EXC_MATCH
(target)¶ 스택의 두 번째 값이 TOS와 일치하는 예외인지 테스트하고, 그렇지 않으면 점프합니다. 스택에서 두 값을 팝 합니다.
버전 3.9에 추가.
-
JUMP_IF_TRUE_OR_POP
(target)¶ TOS가 참이면, 바이트 코드 카운터를 target으로 설정하고 스택에 TOS를 남겨 둡니다. 그렇지 않으면 (TOS가 거짓이면), TOS가 팝 됩니다.
버전 3.1에 추가.
-
JUMP_IF_FALSE_OR_POP
(target)¶ TOS가 거짓이면, 바이트 코드 카운터를 target으로 설정하고 스택에 TOS를 남겨 둡니다. 그렇지 않으면 (TOS가 참이면), TOS가 팝 됩니다.
버전 3.1에 추가.
-
JUMP_ABSOLUTE
(target)¶ 바이트 코드 카운터를 target으로 설정합니다.
-
FOR_ITER
(delta)¶ TOS는 이터레이터입니다. 그것의
__next__()
메서드를 호출합니다. 이것이 새로운 값을 산출하면, 스택에 푸시합니다 (그 밑에 이터레이터를 남겨둡니다). 이터레이터가 소진되었음을 표시하면, TOS가 팝 되고, 바이트 코드 카운터가 delta만큼 증가합니다.
-
LOAD_GLOBAL
(namei)¶ co_names[namei]
라는 이름의 전역을 스택에 로드합니다.
-
SETUP_FINALLY
(delta)¶ try-finally나 try-except 절의 try 블록을 블록 스택으로 푸시합니다. delta는 finally 블록이나 첫 번째 except 블록을 가리킵니다.
-
LOAD_FAST
(var_num)¶ 지역
co_varnames[var_num]
에 대한 참조를 스택으로 푸시합니다.
-
STORE_FAST
(var_num)¶ TOS를 지역
co_varnames[var_num]
에 저장합니다.
-
DELETE_FAST
(var_num)¶ 지역
co_varnames[var_num]
을 삭제합니다.
-
LOAD_CLOSURE
(i)¶ 셀과 자유 변수 스토리지의 슬롯 i에 포함된 셀에 대한 참조를 푸시합니다. i가 co_cellvars의 길이보다 작으면 변수 이름은
co_cellvars[i]
입니다. 그렇지 않으면co_freevars[i - len(co_cellvars)]
입니다.
-
LOAD_DEREF
(i)¶ 셀과 자유 변수 스토리지의 슬롯 i에 포함된 셀을 로드합니다. 스택에 포함된 셀 객체에 대한 참조를 푸시합니다.
-
LOAD_CLASSDEREF
(i)¶ LOAD_DEREF
와 비슷하지만, 셀을 참조하기 전에 먼저 지역 딕셔너리를 확인합니다. 이것은 클래스 본문에서 자유 변수를 로드하는 데 사용됩니다.버전 3.4에 추가.
-
STORE_DEREF
(i)¶ TOS를 셀과 자유 변수 스토리지의 슬롯 i에 포함된 셀에 저장합니다.
-
RAISE_VARARGS
(argc)¶ argc의 값에 따라,
raise
문의 3가지 형식 중 하나를 사용하여 예외를 발생시킵니다:0:
raise
(이전 예외를 다시 발생시킵니다)1:
raise TOS
(TOS
에 있는 예외 인스턴스나 형을 발생시킵니다)2:
raise TOS1 from TOS
(__cause__
가TOS
로 설정된TOS1
에 있는 예외 인스턴스나 형을 발생시킵니다)
-
CALL_FUNCTION
(argc)¶ 위치 인자를 사용하여 콜러블 객체를 호출합니다. argc는 위치 인자의 수를 나타냅니다. 스택의 맨 위에는 위치 인자가 포함되는데, 가장 오른쪽 인자가 맨 위에 있습니다. 인자 아래에는 호출할 콜러블 객체가 있습니다.
CALL_FUNCTION
은 모든 인자와 콜러블 객체를 스택에서 팝하고, 해당 인자로 콜러블 객체를 호출한 다음 콜러블 객체가 반환한 반환 값을 푸시 합니다.버전 3.6에서 변경: 이 옵코드는 위치 인자가 있는 호출에만 사용됩니다.
-
CALL_FUNCTION_KW
(argc)¶ 위치(있다면)와 키워드 인자를 사용하여 콜러블 객체를 호출합니다. argc는 위치와 키워드 인자의 총수를 나타냅니다. 스택의 최상위 요소에는 문자열이어야 하는 키워드 인자의 이름으로 구성된 튜플이 포함되어 있습니다. 그 아래에는 그 튜플에 해당하는 순서로 키워드 인자의 값이 옵니다. 그 아래는 위치 인자인데, 가장 오른쪽 매개 변수가 맨 위에 옵니다. 인자 아래에는 호출할 콜러블 객체가 있습니다.
CALL_FUNCTION_KW
는 모든 인자와 콜러블 객체를 스택에서 팝하고, 해당 인자로 콜러블 객체를 호출한 다음, 콜러블 객체가 반환한 반환 값을 푸시합니다.버전 3.6에서 변경: 키워드 인자는 딕셔너리 대신 튜플에 담기며, argc는 전체 인자 수를 나타냅니다.
-
CALL_FUNCTION_EX
(flags)¶ 위치와 키워드 인자의 변수 집합으로 콜러블 객체를 호출합니다. flags의 최하위 비트가 설정되면, 스택의 맨 위에 추가 키워드 인자가 포함된 매핑 객체가 포함됩니다. 콜러블이 호출되기 전에, 매핑 객체와 이터러블 객체는 각각 “언팩” 되고 그 내용이 각각 키워드와 위치 인자로 전달됩니다.
CALL_FUNCTION_EX
는 모든 인자와 콜러블 객체를 스택에서 팝하고, 해당 인자로 콜러블 객체를 호출한 다음, 콜러블 객체가 반환한 반환 값을 푸시합니다.버전 3.6에 추가.
-
LOAD_METHOD
(namei)¶ TOS 객체에서
co_names[namei]
라는 이름의 메서드를 로드합니다. TOS가 팝 됩니다. 이 바이트 코드는 두 가지 경우를 구별합니다: TOS에 올바른 이름의 메서드가 있으면, 바이트 코드는 연결되지 않은 메서드와 TOS를 푸시합니다. TOS는 연결되지 않은 메서드를 호출할 때CALL_METHOD
에서 첫 번째 인자(self
)로 사용됩니다. 그렇지 않으면,NULL
과 어트리뷰트 조회에 의해 반환된 객체가 푸시 됩니다.버전 3.7에 추가.
-
CALL_METHOD
(argc)¶ 메서드를 호출합니다. argc는 위치 인자의 수입니다. 키워드 인자는 지원되지 않습니다. 이 옵코드는
LOAD_METHOD
와 함께 사용하도록 설계되었습니다. 위치 인자는 스택 맨 위에 있습니다. 그 아래에,LOAD_METHOD
에 설명된 두 항목이 스택에 있습니다 (self
와 연결되지 않은 메서드 객체 또는NULL
과 임의의 콜러블). 이것들이 모두 팝 되고 반환 값이 푸시 됩니다.버전 3.7에 추가.
-
MAKE_FUNCTION
(flags)¶ 스택에 새 함수 객체를 푸시합니다. 바닥에서 맨 위로, 인자가 지정된 플래그 값을 전달하면 소비되는 스택은 값으로 구성되어야 합니다.
0x01
위치 전용과 위치-키워드 매개 변수를 위한 기본값의 위치 순서 튜플0x02
키워드 전용 매개 변수의 기본값 딕셔너리0x04
a tuple of strings containing parameters’ annotations0x08
자유 변수를 위한 셀을 포함하는 튜플, 클로저를 만듭니다함수와 연관된 코드 (TOS1에)
함수의 정규화된 이름 (TOS에)
버전 3.10에서 변경: Flag value
0x04
is a tuple of strings instead of dictionary
-
BUILD_SLICE
(argc)¶ 스택에 슬라이스 객체를 푸시합니다. argc는 2나 3이어야 합니다. 2이면,
slice(TOS1, TOS)
가 푸시 됩니다; 3이면,slice(TOS2, TOS1, TOS)
가 푸시 됩니다. 자세한 정보는slice()
내장 함수를 참조하십시오.
-
EXTENDED_ARG
(ext)¶ 너무 커서 기본 1바이트에 맞지 않는 인자를 가진 옵코드에 접두어로 붙입니다. ext는 인자에서 더 높은 비트로 작동하는 추가 바이트를 보유합니다. 각 옵코드마다, 최대 3개의 접두사
EXTENDED_ARG
가 허용되며, 2바이트에서 4바이트 사이의 인자를 형성합니다.
-
FORMAT_VALUE
(flags)¶ 포맷 문자열 리터럴(f-문자열)을 구현하는 데 사용됩니다. 스택에서 선택적 fmt_spec을 팝 한 다음, 필수 value를 팝 합니다. flags는 다음과 같이 해석됩니다:
(flags & 0x03) == 0x00
: value는 있는 그대로 포맷됩니다.(flags & 0x03) == 0x01
: 포맷하기 전에 value에 대해str()
을 호출합니다.(flags & 0x03) == 0x02
: 포맷하기 전에 value에 대해repr()
을 호출합니다.(flags & 0x03) == 0x03
: 포맷하기 전에 value에 대해ascii()
를 호출합니다.(flags & 0x04) == 0x04
: 스택에서 fmt_spec을 팝 하고 그것을 사용합니다, 그렇지 않으면 빈 fmt_spec을 사용합니다.
PyObject_Format()
을 사용하여 포맷이 수행됩니다. 결과는 스택에 푸시 됩니다.버전 3.6에 추가.
-
MATCH_CLASS
(count)¶ TOS is a tuple of keyword attribute names, TOS1 is the class being matched against, and TOS2 is the match subject. count is the number of positional sub-patterns.
Pop TOS. If TOS2 is an instance of TOS1 and has the positional and keyword attributes required by count and TOS, set TOS to
True
and TOS1 to a tuple of extracted attributes. Otherwise, set TOS toFalse
.버전 3.10에 추가.
-
GEN_START
(kind)¶ Pops TOS. The
kind
operand corresponds to the type of generator or coroutine. The legal kinds are 0 for generator, 1 for coroutine, and 2 for async generator.버전 3.10에 추가.
-
ROT_N
(count)¶ Lift the top count stack items one position up, and move TOS down to position count.
버전 3.10에 추가.
-
HAVE_ARGUMENT
¶ 이것은 진짜 옵코드가 아닙니다. 인자를 사용하지 않는 옵코드와 사용하는 옵코드 사이의 구분 선을 식별합니다 (각각,
< HAVE_ARGUMENT
와>= HAVE_ARGUMENT
).버전 3.6에서 변경: 이제 모든 명령어에는 인자가 있지만,
< HAVE_ARGUMENT
인 옵코드는 이를 무시합니다. 이전에는,>= HAVE_ARGUMENT
인 옵코드에만 인자가 있었습니다.
옵코드 모음¶
이 모음은 바이트 코드 명령어의 자동 검사를 위해 제공됩니다:
-
dis.
opname
¶ 연산 이름의 시퀀스, 바이트 코드를 사용하여 인덱싱할 수 있습니다.
-
dis.
opmap
¶ 연산 이름을 바이트 코드로 매핑하는 딕셔너리.
-
dis.
cmp_op
¶ 모든 비교 연산 이름의 시퀀스.
-
dis.
hasconst
¶ 상수에 액세스하는 바이트 코드의 시퀀스.
-
dis.
hasfree
¶ 자유 변수에 액세스하는 바이트 코드의 시퀀스 (이 문맥에서 ‘자유’는 내부 스코프에서 참조되는 현재 스코프의 이름이나 이 스코프에서 참조되는 외부 스코프의 이름을 나타냅니다. 전역이나 내장 스코프에 대한 참조는 포함하지 않습니다).
-
dis.
hasname
¶ 어트리뷰트를 이름으로 액세스하는 바이트 코드의 시퀀스.
-
dis.
hasjrel
¶ 상대 점프 대상이 있는 바이트 코드의 시퀀스.
-
dis.
hasjabs
¶ 절대 점프 대상이 있는 바이트 코드의 시퀀스.
-
dis.
haslocal
¶ 지역 변수에 액세스하는 바이트 코드의 시퀀스.
-
dis.
hascompare
¶ 불리언 연산의 바이트 코드의 시퀀스.