dis — Python 바이트 코드 역어셈블러¶
소스 코드: Lib/dis.py
dis 모듈은 CPython 바이트 코드 를 역어셈블하여 분석하는 기능을 지원합니다. 이 모듈이 입력으로 사용하는 CPython 바이트 코드는 파일 Include/opcode.h 에 정의되어 있으며 컴파일러와 인터프리터에서 사용됩니다.
바이트 코드는 CPython 인터프리터의 구현 세부 사항입니다. 파이썬 버전 간에 바이트 코드가 추가, 제거 또는 변경되지 않을 것이라는 보장은 없습니다. 이 모듈을 사용하는 것이 파이썬 VM이나 파이썬 릴리스에 걸쳐 작동할 것으로 생각하지 말아야 합니다.
버전 3.6에서 변경: 명령어마다 2바이트를 사용합니다. 이전에는 바이트 수가 명령어에 따라 달랐습니다.
버전 3.10에서 변경: 점프, 예외 처리 및 루프 명령의 인자가 이제 바이트 오프셋이 아닌 명령어 오프셋입니다.
버전 3.11에서 변경: 일부 명령어는 하나 이상의 인라인 캐시 항목을 포함하며, 이는 CACHE 명령의 형태를 띱니다. 이러한 명령어는 기본적으로 숨겨져 있지만, 모든 dis 유틸리티에 show_caches=True 를 전달하여 표시할 수 있습니다. 또한 인터프리터는 이제 다양한 실행 환경에 맞게 바이트 코드를 최적화(specialize)합니다. 적응형(adaptive) 바이트 코드는 adaptive=True 를 전달하여 확인할 수 있습니다.
버전 3.12에서 변경: 점프의 인자는 점프 명령의 CACHE 항목 바로 뒤에 나오는 명령어와 비교한 대상 명령어의 오프셋입니다.
그 결과로, 정방향 점프의 경우 CACHE 명령어의 존재가 무시되지만(transparent), 역방향 점프를 해석할 때는 이를 고려해야 합니다.
버전 3.13에서 변경: 출력 결과에서 점프 대상과 예외 처리기에 대해 명령 오프셋 대신 논리적 라벨을 표시합니다. -O 명령 줄 옵션과 show_offsets 인수가 추가되었습니다.
예제: 함수 myfunc() 가 주어졌을 때:
def myfunc(alist):
return len(alist)
다음 명령을 사용하여 myfunc() 의 역어셈블 결과를 표시할 수 있습니다.
>>> dis.dis(myfunc)
2 RESUME 0
3 LOAD_GLOBAL 1 (len + NULL)
LOAD_FAST_BORROW 0 (alist)
CALL 1
RETURN_VALUE
(“2”는 줄 번호입니다).
명령 줄 인터페이스¶
dis 모듈을 명령 줄에서 스크립트로 호출할 수 있습니다:
python -m dis [-h] [-C] [-O] [-P] [-S] [infile]
다음 옵션들이 허용됩니다:
- -h, --help¶
사용법을 표시하고 종료합니다.
- -C, --show-caches¶
인라인 캐시를 표시합니다.
Added in version 3.13.
- -O, --show-offsets¶
명령어의 오프셋을 표시합니다.
Added in version 3.13.
- -P, --show-positions¶
소스 코드 내 명령어 위치를 표시합니다.
Added in version 3.14.
- -S, --specialized¶
최적화된(specialized) 바이트 코드를 표시합니다.
Added in version 3.14.
infile 이 지정되면 해당 코드를 역어셈블하여 stdout에 출력합니다. 그렇지 않으면 stdin에서 받은 컴파일된 소스 코드에 대해 역어셈블을 수행합니다.
바이트 코드 분석¶
Added in version 3.4.
바이트 코드 분석 API는 컴파일된 코드의 세부 사항에 쉽게 액세스 할 수 있도록 하는 Bytecode 객체로 파이썬 코드 조각을 감쌀 수 있도록 합니다.
- class dis.Bytecode(x, *, first_line=None, current_offset=None, show_caches=False, adaptive=False, show_offsets=False, show_positions=False, show_jit=False)¶
함수, 제너레이터, 비동기 제너레이터, 코루틴, 메서드, 소스 코드 문자열 또는 (
compile()에서 반환된) 코드 객체에 해당하는 바이트 코드를 분석합니다.이것은 아래에 나열된 많은 함수, 특히
get_instructions()를 둘러싼 편리한 래퍼입니다,Bytecode인스턴스를 이터레이트 하면 바이트 코드 연산이Instruction인스턴스로 산출되기 때문입니다.first_line이
None이 아니면, 역 어셈블 된 코드에서 첫 번째 소스 줄에 대해 보고해야 하는 줄 번호를 나타냅니다. 그렇지 않으면, 소스 줄 정보(있다면)를 역 어셈블 된 코드 객체에서 직접 취합니다.current_offset이
None이 아니면, 역 어셈블 된 코드의 명령어 오프셋을 나타냅니다. 이를 설정하면,dis()가 지정된 옵코드(opcode)에 대해 “현재 명령어” 마커를 표시합니다.show_caches 가
True이면,dis()는 인터프리터가 바이트 코드를 특수화(specialize)하는 데 사용하는 인라인 캐시 항목을 표시합니다.adaptive 가
True이면,dis()는 원본 바이트 코드와 다를 수 있는 특수화된 바이트 코드를 표시합니다.show_offsets 가
True이면,dis()는 출력에 명령어 오프셋을 포함합니다.show_positions 가
True이면,dis()는 출력에 명령어의 소스 코드 위치를 포함합니다.show_jit 가
True이면,dis()는 기본적으로 숨겨져 있는 JIT 진입점을 표시하는ENTER_EXECUTOR명령어를 보여줍니다.- classmethod from_traceback(tb, *, show_caches=False)¶
주어진 트레이스백에서
Bytecode인스턴스를 구성하고, current_offset을 예외를 일으킨 명령어로 설정합니다.
- codeobj¶
컴파일된 코드 객체.
- first_line¶
코드 객체의 첫 번째 소스 줄 (사용 가능하다면)
- info()¶
code_info()처럼, 코드 객체에 대한 자세한 정보가 포함된 포맷된 여러 줄 문자열을 반환합니다.
버전 3.7에서 변경: 이제 코루틴과 비동기 제너레이터 객체를 처리할 수 있습니다.
버전 3.11에서 변경: show_caches 및 adaptive 매개변수가 추가되었습니다.
버전 3.13에서 변경: show_offsets 매개변수가 추가되었습니다.
버전 3.14에서 변경: show_positions 매개변수가 추가되었습니다.
버전 3.16.0a0 (unreleased)에서 변경: show_jit 매개변수가 추가되었습니다.
예제:
>>> bytecode = dis.Bytecode(myfunc)
>>> for instr in bytecode:
... print(instr.opname)
...
RESUME
LOAD_GLOBAL
LOAD_FAST_BORROW
CALL
RETURN_VALUE
분석 함수¶
dis 모듈은 입력을 원하는 출력으로 직접 변환하는 다음 분석 함수들을 정의합니다. 이 기능들은 중간 분석 객체가 필요하지 않은 단일 작업만 수행할 때 유용할 수 있습니다:
- dis.code_info(x)¶
제공된 함수, 제너레이터, 비동기 제너레이터, 코루틴, 메서드, 소스 코드 문자열 또는 코드 객체에 대한 자세한 코드 객체 정보가 포함된 포맷된 여러 줄 문자열을 반환합니다.
코드 정보 문자열의 정확한 내용은 구현에 따라 달라지며 파이썬 VM이나 파이썬 릴리스에 걸쳐 임의로 변경될 수 있습니다.
Added in version 3.2.
버전 3.7에서 변경: 이제 코루틴과 비동기 제너레이터 객체를 처리할 수 있습니다.
- dis.show_code(x, *, file=None)¶
제공된 함수, 메서드, 소스 코드 문자열 또는 코드 객체에 대한 자세한 코드 객체 정보를 file(또는 file이 지정되지 않으면
sys.stdout)로 인쇄합니다.이것은
print(code_info(x), file=file)의 편리한 축약 형으로, 인터프리터 프롬프트에서의 대화식 탐색을 위한 것입니다.Added in version 3.2.
버전 3.4에서 변경: file 매개 변수를 추가했습니다.
- dis.dis(x=None, *, file=None, depth=None, show_caches=False, adaptive=False, show_offsets=False, show_positions=False, show_jit=False)¶
x 객체를 역어셈블합니다. x 는 모듈, 클래스, 메서드, 함수, 제너레이터, 비동기 제너레이터, 코루틴, 코드 객체, 소스 코드 문자열 또는 가공되지 않은 바이트 코드의 바이트 시퀀스를 나타낼 수 있습니다. 모듈인 경우 모든 함수를 역어셈블합니다. 클래스인 경우 모든 메서드(클래스 및 정적 메서드 포함)를 역어셈블합니다. 코드 객체나 원시 바이트 코드 시퀀스인 경우, 각 바이트 코드 명령어를 한 줄씩 출력합니다. 또한 중첩된 코드 객체를 재귀적으로 역어셈블합니다. 여기에는 제너레이터 표현식, 중첩된 함수, 중첩된 클래스의 본체 및 annotation scopes 에 사용되는 코드 객체가 포함될 수 있습니다. 문자열은 역어셈블되기 전에
compile()내장 함수를 사용하여 먼저 코드 객체로 컴파일됩니다. 객체가 제공되지 않으면 이 함수는 마지막 트레이스백을 역어셈블합니다.역 어셈블리는 제공된다면 제공된 file 인자에, 그렇지 않으면
sys.stdout에 텍스트로 기록됩니다.재귀의 최대 깊이는
None이 아닌 한 depth에 의해 제한됩니다.depth=0은 재귀가 없음을 의미합니다.show_caches 가
True이면 이 함수는 인터프리터가 바이트 코드를 특수화하는 데 사용하는 인라인 캐시 항목을 표시합니다.adaptive 가
True이면 이 함수는 원본 바이트 코드와 다를 수 있는 특수화된 바이트 코드를 표시합니다.show_jit 가
True이면 이 함수는 기본적으로 숨겨져 있는 JIT 진입점을 나타내는ENTER_EXECUTOR명령어를 보여줍니다.버전 3.4에서 변경: file 매개 변수를 추가했습니다.
버전 3.7에서 변경: 재귀 역 어셈블을 구현하고 depth 매개 변수를 추가했습니다.
버전 3.7에서 변경: 이제 코루틴과 비동기 제너레이터 객체를 처리할 수 있습니다.
버전 3.11에서 변경: show_caches 및 adaptive 매개변수가 추가되었습니다.
버전 3.13에서 변경: show_offsets 매개변수가 추가되었습니다.
버전 3.14에서 변경: show_positions 매개변수가 추가되었습니다.
버전 3.16.0a0 (unreleased)에서 변경: show_jit 매개변수가 추가되었습니다.
- dis.distb(tb=None, *, file=None, show_caches=False, adaptive=False, show_offsets=False, show_positions=False, show_jit=False)¶
트레이스백의 최상단 함수를 역 어셈블 합니다. 전달되지 않으면 마지막 트레이스백을 사용합니다. 예외를 일으키는 명령어가 표시됩니다.
역 어셈블리는 제공된다면 제공된 file 인자에, 그렇지 않으면
sys.stdout에 텍스트로 기록됩니다.버전 3.4에서 변경: file 매개 변수를 추가했습니다.
버전 3.11에서 변경: show_caches 및 adaptive 매개변수가 추가되었습니다.
버전 3.13에서 변경: show_offsets 매개변수가 추가되었습니다.
버전 3.14에서 변경: show_positions 매개변수가 추가되었습니다.
버전 3.16.0a0 (unreleased)에서 변경: show_jit 매개변수가 추가되었습니다.
- dis.disassemble(code, lasti=-1, *, file=None, show_caches=False, adaptive=False, show_offsets=False, show_positions=False, show_jit=False)¶
- dis.disco(code, lasti=-1, *, file=None, show_caches=False, adaptive=False, show_offsets=False, show_positions=False, show_jit=False)¶
코드 객체를 역 어셈블 하고, lasti가 제공되면 마지막 명령어를 표시합니다. 출력은 다음 열로 나뉩니다:
명령어의 소스 코드 위치입니다. show_positions 가 참이면 전체 위치 정보가 표시되고, 그렇지 않으면(기본값) 줄 번호만 표시됩니다.
현재 명령어,
-->로 표시됩니다,레이블이 있는 명령어,
>>로 표시됩니다,명령어의 주소,
연산 코드 이름,
연산 매개 변수, 그리고
괄호 안에 있는 매개 변수의 해석.
매개 변수 해석은 지역과 전역 변수 이름, 상숫값, 분기 대상 및 비교 연산자를 인식합니다.
역 어셈블리는 제공된다면 제공된 file 인자에, 그렇지 않으면
sys.stdout에 텍스트로 기록됩니다.버전 3.4에서 변경: file 매개 변수를 추가했습니다.
버전 3.11에서 변경: show_caches 및 adaptive 매개변수가 추가되었습니다.
버전 3.13에서 변경: show_offsets 매개변수가 추가되었습니다.
버전 3.14에서 변경: show_positions 매개변수가 추가되었습니다.
버전 3.16.0a0 (unreleased)에서 변경: show_jit 매개변수가 추가되었습니다.
- dis.get_instructions(x, *, first_line=None, show_caches=False, adaptive=False, show_jit=False)¶
제공된 함수, 메서드, 소스 코드 문자열 또는 코드 객체의 명령어들에 대한 이터레이터를 반환합니다.
이터레이터는 제공된 코드의 각 연산에 대한 세부 정보를 제공하는
Instruction네임드 튜플의 연속을 생성합니다.first_line이
None이 아니면, 역 어셈블 된 코드에서 첫 번째 소스 줄에 대해 보고해야 하는 줄 번호를 나타냅니다. 그렇지 않으면, 소스 줄 정보(있다면)를 역 어셈블 된 코드 객체에서 직접 취합니다.adaptive 매개변수는
dis()에서와 동일하게 작동합니다.show_jit 매개변수는
dis()에서와 동일하게 작동합니다.Added in version 3.4.
버전 3.11에서 변경: show_caches 및 adaptive 매개변수가 추가되었습니다.
버전 3.13에서 변경: show_caches 매개변수는 폐지되어 아무런 효과가 없습니다. 반복자는 show_caches 값에 관계없이 cache_info 필드가 채워진
Instruction인스턴스를 생성하며, 더 이상 캐시 항목에 대한 별도의 항목을 생성하지 않습니다.버전 3.16.0a0 (unreleased)에서 변경: show_jit 매개변수가 추가되었습니다.
- dis.findlinestarts(code)¶
이 제너레이터 함수는 code object code 의
co_lines()메서드를 사용하여 소스 코드의 줄 시작 오프셋을 찾습니다. 이들은(offset, lineno)쌍으로 생성됩니다.버전 3.6에서 변경: 줄 번호가 줄어들 수 있습니다. 전에는, 언제나 증가했습니다.
버전 3.10에서 변경: code object 의
co_firstlineno및codeobject.co_lnotab속성 대신 PEP 626co_lines()메서드가 사용됩니다.버전 3.13에서 변경: 소스 줄과 매핑되지 않는 바이트 코드의 경우 줄 번호가
None일 수 있습니다.
- dis.findlabels(code)¶
원시 컴파일된 바이트 코드 문자열 code에서 점프 대상인 모든 오프셋을 감지하고, 이러한 오프셋의 리스트를 반환합니다.
- dis.stack_effect(opcode, oparg=None, *, jump=None)¶
인자 oparg를 갖는 opcode의 스택 효과를 계산합니다.
코드에 점프 대상이 있고 jump가
True이면,stack_effect()는 점프의 스택 효과를 반환합니다. jump가False이면, 점프하지 않는 스택 효과를 반환합니다. jump가None(기본값)이면, 두 경우의 최대 스택 효과를 반환합니다.Added in version 3.4.
버전 3.8에서 변경: jump 매개 변수를 추가했습니다.
버전 3.13에서 변경:
oparg이 생략되거나None인 경우, 이제oparg=0에 대해 스택 효과가 반환됩니다. 이전에는 인수를 사용하는 옵코드의 경우 오류로 처리되었습니다. 또한opcode가 인수를 사용하지 않을 때 정수oparg를 전달해도 더 이상 오류가 발생하지 않으며, 이 경우 해당oparg은 무시됩니다.
파이썬 바이트 코드 명령어¶
get_instructions() 함수와 Bytecode 클래스는 바이트 코드 명령어의 세부 사항을 Instruction 인스턴스로 제공합니다:
- class dis.Instruction¶
바이트 코드 연산에 대한 세부 사항
- opname¶
연산의 사람이 읽을 수 있는 이름
- arg¶
연산에 대한 숫자 인자 (있다면), 그렇지 않으면
None
- argval¶
해석된 인자 값(있는 경우), 없으면
None
- argrepr¶
인자에 대한 읽기 쉬운 설명(있는 경우), 없으면 빈 문자열.
- offset¶
바이트 코드 시퀀스 내에서 연산의 시작 인덱스
- start_offset¶
바이트 코드 시퀀스 내에서 연산의 시작 인덱스이며, 존재할 경우 접두사
EXTENDED_ARG연산을 포함합니다. 그렇지 않으면offset과 동일합니다.
- cache_offset¶
연산 뒤에 오는 캐시 항목의 시작 인덱스
- end_offset¶
연산 뒤에 오는 캐시 항목의 종료 인덱스
- starts_line¶
이 옵코드가 소스 줄을 시작하는 경우
True, 그렇지 않으면False
- line_number¶
이 옵코드와 관련된 소스 줄 번호(있는 경우), 없으면
None
- is_jump_target¶
다른 코드가 여기로 점프하면
True, 그렇지 않으면False
- jump_target¶
점프 연산인 경우 점프 대상의 바이트 코드 인덱스이며, 그렇지 않으면
None
- positions¶
이 명령어가 포함하는 시작 및 종료 위치를 보유하는
dis.Positions객체입니다.
- cache_info¶
이 명령어의 캐시 항목에 대한 정보로,
(name, size, data)형태의 삼중항입니다. 여기서name과size는 캐시 형식을 설명하며 데이터는 캐시 내용입니다. 명령어가 캐시를 가지고 있지 않으면cache_info는None입니다.
Added in version 3.4.
버전 3.11에서 변경:
positions필드가 추가되었습니다.버전 3.13에서 변경:
starts_line필드가 변경되었습니다.start_offset,cache_offset,end_offset,baseopname,baseopcode,jump_target,oparg,line_number및cache_info필드가 추가되었습니다.
- class dis.Positions¶
정보를 사용할 수 없는 경우 일부 필드는
None일 수 있습니다.- lineno¶
- end_lineno¶
- col_offset¶
- end_col_offset¶
Added in version 3.11.
파이썬 컴파일러는 현재 다음 바이트 코드 명령어를 생성합니다.
일반 명령어
다음 내용에서 인터프리터 스택을 STACK 이라 부르며, 이를 파이썬 리스트처럼 취급하여 동작을 설명합니다. 스택의 상단은 이 언어에서 STACK[-1] 에 해당합니다.
- NOP¶
아무것도 하지 않는 코드입니다. 바이트 코드 옵티마이저의 자리 표시자 및 라인 트레이싱 이벤트 생성을 위해 사용됩니다.
- NOT_TAKEN¶
아무것도 하지 않는 코드입니다. 인터프리터가
sys.monitoring을 위한BRANCH_LEFT및BRANCH_RIGHT이벤트를 기록하는 데 사용됩니다.Added in version 3.14.
- POP_ITER¶
스택의 맨 위에 있는 이터레이터를 제거합니다.
Added in version 3.14.
- POP_TOP¶
스택 상단 항목을 제거합니다:
STACK.pop()
- END_FOR¶
스택 상단 항목을 제거합니다.
POP_TOP과 동일합니다. 루프 끝에서 정리 작업을 수행하기 위해 사용되며, 이름도 그에 맞춰 명명되었습니다.Added in version 3.12.
- END_SEND¶
del STACK[-2]를 구현합니다. 제너레이터가 종료될 때 정리 작업을 수행하는 데 사용됩니다.Added in version 3.12.
- COPY(i)¶
원래 위치에서 제거하지 않고, i번째 항목을 스택 상단으로 푸시합니다:
assert i > 0 STACK.append(STACK[-i])
Added in version 3.11.
- SWAP(i)¶
스택의 최상단과 i번째 요소를 맞바꿉니다:
STACK[-i], STACK[-1] = STACK[-1], STACK[-i]
Added in version 3.11.
- CACHE¶
이 옵코드는 실제 명령어가 아니라 인터프리터가 바이트 코드 자체에 유용한 데이터를 캐싱하기 위한 여분 공간을 표시하는 데 사용됩니다. 모든
dis유틸리티에서 자동으로 숨겨지지만,show_caches=True를 사용하여 확인할 수 있습니다.논리적으로 이 공간은 이전 명령어의 일부입니다. 많은 옵코드는 뒤에 정확한 수의 캐시가 이어질 것을 예상하며, 실행 시 인터프리터에게 이를 건너뛰도록 지시합니다.
채워진 캐시는 임의의 명령어로 보일 수 있으므로, 가속된 데이터가 포함된 원시(raw) 및 적응형 바이트 코드를 읽거나 수정할 때 주의해야 합니다.
Added in version 3.11.
단항 연산
단항 연산은 스택의 최상단을 취하고, 연산을 적용한 다음, 결과를 스택에 다시 푸시합니다.
- UNARY_NEGATIVE¶
STACK[-1] = -STACK[-1]을 구현합니다.
- UNARY_INVERT¶
STACK[-1] = ~STACK[-1]를 구현합니다.
- GET_ITER¶
STACK[-1] = iter(STACK[-1])을 구현합니다.
- GET_YIELD_FROM_ITER¶
If
STACK[-1]is a generator iterator or coroutine object it is left as is. Otherwise, implementsSTACK[-1] = iter(STACK[-1]).Added in version 3.5.
- TO_BOOL¶
STACK[-1] = bool(STACK[-1])를 구현합니다.Added in version 3.13.
이항 및 인플레이스 연산
이항 연산은 스택의 최상위 두 항목(STACK[-1] 및 STACK[-2])을 제거합니다. 연산을 수행한 후 그 결과를 다시 스택에 넣습니다.
인플레이스 연산은 이항 연산과 유사하지만, STACK[-2] 가 지원하는 경우 인플레이스로 수행되며 결과로 나오는 STACK[-1] 이 원래의 STACK[-2] 와 동일할 수도 있고 아닐 수도 있습니다.
- BINARY_OP(op)¶
op 값에 따라 이항 및 인플레이스 연산자를 구현합니다:
rhs = STACK.pop() lhs = STACK.pop() STACK.append(lhs op rhs)
Added in version 3.11.
버전 3.14에서 변경: oparg가 :
NB_SUBSCR인 경우, 이항 인덱싱을 구현합니다(옵코드BINARY_SUBSCR를 대체).
- STORE_SUBSCR¶
구현합니다:
key = STACK.pop() container = STACK.pop() value = STACK.pop() container[key] = value
- DELETE_SUBSCR¶
구현합니다:
key = STACK.pop() container = STACK.pop() del container[key]
- BINARY_SLICE¶
구현합니다:
end = STACK.pop() start = STACK.pop() container = STACK.pop() STACK.append(container[start:end])
Added in version 3.12.
- STORE_SLICE¶
구현합니다:
end = STACK.pop() start = STACK.pop() container = STACK.pop() value = STACK.pop() container[start:end] = value
Added in version 3.12.
코루틴 옵코드
- GET_AWAITABLE(where)¶
STACK[-1] = get_awaitable(STACK[-1])를 구현합니다. 여기서get_awaitable(o)는o가 코루틴 객체이거나CO_ITERABLE_COROUTINE플래그를 가진 제너레이터 객체인 경우o를 반환하고, 그렇지 않으면o.__await__를 해결합니다.where피연산자가 0이 아니면 해당 명령어가 발생하는 위치를 나타냅니다:1:__aenter__호출 후2:__aexit__호출 후
Added in version 3.5.
버전 3.11에서 변경: 이전에는 이 명령어가 oparg를 가지지 않았습니다.
- GET_AITER¶
STACK[-1] = STACK[-1].__aiter__()를 구현합니다.Added in version 3.5.
버전 3.7에서 변경:
__aiter__로부터 어웨이터블 객체를 반환하는 것은 더는 지원되지 않습니다.
- GET_ANEXT¶
스택에
STACK.append(get_awaitable(STACK[-1].__anext__()))를 구현합니다.get_awaitable에 대한 자세한 내용은GET_AWAITABLE을 참조하십시오.Added in version 3.5.
- END_ASYNC_FOR¶
async for루프를 종료합니다. 다음 항목을 기다릴 때(await) 발생하는 예외를 처리합니다. 스택은STACK[-2]에 비동기 반복 가능 객체를,STACK[-1]에 발생한 예외를 포함하고 있습니다. 두 항목 모두 팝됩니다. 만약 예외가StopAsyncIteration이 아니면 다시 발생시킵니다.Added in version 3.8.
버전 3.11에서 변경: 스택상의 예외 표현이 이제 세 개가 아닌 하나의 항목으로 구성됩니다.
- CLEANUP_THROW¶
현재 프레임을 통해 호출된
throw()또는close()중에 발생한 예외를 처리합니다. 만약STACK[-1]이StopIteration의 인스턴스라면, 스택에서 세 개의 값을 팝하고 그 중 하나인value멤버를 푸시합니다. 그렇지 않으면STACK[-1]을 다시 발생시킵니다.Added in version 3.12.
기타 옵코드
- SET_ADD(i)¶
구현합니다:
item = STACK.pop() set.add(STACK[-i], item)
set comprehension(집합 컴프리헨션) 구현에 사용됩니다.
- LIST_APPEND(i)¶
구현합니다:
item = STACK.pop() list.append(STACK[-i], item)
리스트 컴프리헨션을 구현하는 데 사용됩니다.
- MAP_ADD(i)¶
구현합니다:
value = STACK.pop() key = STACK.pop() dict.__setitem__(STACK[-i], key, value)
딕셔너리 컴프리헨션을 구현하는 데 사용됩니다.
Added in version 3.1.
버전 3.8에서 변경: 맵 값은
STACK[-1]이고 맵 키는STACK[-2]입니다. 이전에는 이 둘이 바뀌어 있었습니다.
모든 SET_ADD, LIST_APPEND 및 MAP_ADD 명령어에 대해, 추가된 값이나 키/값 쌍이 팝 되지만, 컨테이너 객체는 스택에 남아 있어서 루프의 추가 이터레이션에 사용할 수 있습니다.
- RETURN_VALUE¶
함수 호출자에게
STACK[-1]을 반환합니다.
- YIELD_VALUE¶
generator 에서
STACK.pop()을 팖(yield)합니다.버전 3.11에서 변경: oparg를 스택 깊이로 설정합니다.
버전 3.12에서 변경: 제너레이터를 효율적으로 닫기 위해 oparg를 예외 블록 깊이로 설정합니다.
버전 3.13에서 변경: 이 명령어가 yield-from 또는 await의 일부인 경우 oparg는
1이고, 그렇지 않으면0입니다.
- SETUP_ANNOTATIONS¶
locals()에__annotations__가 정의되어 있는지 확인합니다, 그렇지 않으면 비어있는dict로 설정됩니다. 이 옵코드는 클래스나 모듈 본문에 변수 어노테이션이 정적으로 포함될 때만 생성됩니다.Added in version 3.6.
- POP_EXCEPT¶
스택에서 값을 팝하며, 이는 예외 상태를 복구하는 데 사용됩니다.
버전 3.11에서 변경: 스택상의 예외 표현이 이제 세 개가 아닌 하나의 항목으로 구성됩니다.
- RERAISE¶
스택 최상단에 있는 예외를 다시 발생시킵니다. oparg가 0이 아니면 스택에서 하나 더 값을 팝하여 현재 프레임의
f_lasti를 설정하는 데 사용합니다.Added in version 3.9.
버전 3.11에서 변경: 스택상의 예외 표현이 이제 세 개가 아닌 하나의 항목으로 구성됩니다.
- PUSH_EXC_INFO¶
스택에서 값을 팝합니다. 현재 예외를 스택 최상단에 푸시합니다. 원래 팝되었던 값을 다시 스택에 푸시합니다. 예외 처리기에서 사용됩니다.
Added in version 3.11.
- CHECK_EXC_MATCH¶
except에 대한 예외 매칭을 수행합니다.STACK[-2]가STACK[-1]과 일치하는 예외인지 테스트합니다.STACK[-1]을 팝하고 테스트의 불리언 결과를 푸시합니다.Added in version 3.11.
- CHECK_EG_MATCH¶
except*에 대한 예음 매칭을 수행합니다.STACK[-2]가 나타내는 예외 그룹에split(STACK[-1])를 적용합니다.일치하는 경우, 스택에서 두 항목을 팝하고 일치하지 않는 하위 그룹(전체 일치의 경우
None)과 그 뒤에 이어서 일치하는 하위 그룹을 푸시합니다. 일치하는 항목이 없는 경우, 한 항목(매칭 타입)을 팝하고None을 푸시합니다.Added in version 3.11.
- WITH_EXCEPT_START¶
스택의 4번 위치에 있는 함수를 스택 최상단의 예외를 나타내는 인자(type, val, tb)와 함께 호출합니다.
with문에서 예외가 발생했을 때context_manager.__exit__(*exc_info())호출을 구현하는 데 사용됩니다.Added in version 3.9.
버전 3.11에서 변경:
__exit__함수가 스택의 7번 위치가 아닌 4번 위치에 있습니다. 이제 스택 상의 예외 표현은 세 항목이 아닌 하나로 구성됩니다.
- LOAD_COMMON_CONSTANT¶
공통 상수를 스택에 푸시합니다. 인터프리터는 이 명령어가 지원하는 상수의 고정된 목록을 포함합니다.
assert문이AssertionError를 로드할 때 사용됩니다.Added in version 3.14.
- LOAD_BUILD_CLASS¶
builtins.__build_class__()를 스택에 푸시합니다. 나중에 이를 호출하여 클래스를 생성합니다.
- GET_LEN¶
STACK.append(len(STACK[-1]))을 수행합니다. 패턴 구조와의 비교가 필요한match문에서 사용됩니다.Added in version 3.10.
- MATCH_MAPPING¶
STACK[-1]이collections.abc.Mapping의 인스턴스인 경우(또는 더 정확하게는,tp_flags에Py_TPFLAGS_MAPPING플래그가 설정된 경우) 스택에True를 푸시합니다. 그렇지 않으면False를 푸시합니다.Added in version 3.10.
- MATCH_SEQUENCE¶
STACK[-1]이collections.abc.Sequence의 인스턴스이고,str/bytes/bytearray의 인스턴스가 아닌 경우(또는 더 정확하게는,tp_flags에Py_TPFLAGS_SEQUENCE플래그가 설정된 경우) 스택에True를 푸시합니다. 그렇지 않으면False를 푸시합니다.Added in version 3.10.
- MATCH_KEYS¶
STACK[-1]은 매핑 키의 튜플이고,STACK[-2]는 매칭 대상입니다.STACK[-2]가STACK[-1]에 포함된 모든 키를 포함하는 경우, 해당 값들을 포함하는tuple을 푸시합니다. 그렇지 않으면None을 푸시합니다.Added in version 3.10.
버전 3.11에서 변경: 이전에는 이 명령어가 성공(
True) 또는 실패(False)를 나타내는 불리언 값을 함께 푸시했습니다.
- STORE_NAME(namei)¶
name = STACK.pop()을 구현합니다. namei 는 code object 의co_names속성에서 name 의 인덱스입니다. 컴파일러는 가능한 경우STORE_FAST또는STORE_GLOBAL을 사용하려고 시도합니다.
- DELETE_NAME(namei)¶
del name을 구현하며, 여기서 namei 는 code object 의co_names속성 내의 인덱스입니다.
- UNPACK_SEQUENCE(count)¶
STACK[-1]을 count 개의 개별 값으로 언팩킹하며, 이들은 스택에 오른쪽에서 왼쪽 방향으로 놓입니다. 정확히 count 개의 값이 있어야 합니다.assert(len(STACK[-1]) == count) STACK.extend(STACK.pop()[:-count-1:-1])
- UNPACK_EX(counts)¶
스타 표시가 있는 대상과 함께 할당을 구현합니다.
STACK[-1]의 이터러블을 개별 값으로 언팩하며, 전체 값의 수는 이터러블의 항목 수보다 적을 수 있습니다. 새 값 중 하나는 남은 모든 항목의 리스트가 됩니다.리스트 값 앞과 뒤의 값 개수는 255개로 제한됩니다.
리스트 값 앞의 값 개수는 오프코드의 인자로 인코딩됩니다. 리스트 뒤에 값이 있는 경우 그 수는
EXTENDED_ARG를 사용하여 인코딩됩니다. 결과적으로, 인자는 counts 의 낮은 바이트가 리스트 이전 값의 개수이고, 높은 바이트가 그 이후 값의 개수인 두 바이트 값으로 볼 수 있습니다.추출된 값들은 스택에 오른쪽에서 왼쪽 방향으로 놓입니다. 즉,
a, *b, c = d는 실행 후STACK.extend((a, b, c))와 동일하게 저장됩니다.
- STORE_ATTR(namei)¶
구현합니다:
obj = STACK.pop() value = STACK.pop() obj.name = value
여기서 namei 는 code object 의
co_names에서 name의 인덱스입니다.
- DELETE_ATTR(namei)¶
구현합니다:
obj = STACK.pop() del obj.name
여기서 namei 는 code object 의
co_names에서 name의 인덱스입니다.
- STORE_GLOBAL(namei)¶
STORE_NAME처럼 작동하지만, 이름을 전역으로 저장합니다.
- DELETE_GLOBAL(namei)¶
DELETE_NAME처럼 작동하지만, 전역 이름을 삭제합니다.
- LOAD_CONST(consti)¶
co_consts[consti]를 스택으로 푸시합니다.
- LOAD_SMALL_INT(i)¶
정수
i``를 스택에 푸시합니다. ``i``는 ``range(256)내에 있어야 합니다.Added in version 3.14.
- LOAD_NAME(namei)¶
co_names[namei]와 연관된 값을 스택에 푸시합니다. 이름은 로컬, 그다음 전역, 그 다음 내장 함수에서 검색됩니다.
- LOAD_LOCALS¶
로컬 딕셔너리에 대한 참조를 스택에 푸시합니다. 이는
LOAD_FROM_DICT_OR_DEREF및LOAD_FROM_DICT_OR_GLOBALS를 위한 네임스페이스 딕셔너리를 준비하는 데 사용됩니다.Added in version 3.12.
- LOAD_FROM_DICT_OR_GLOBALS(i)¶
스택에서 매핑을 팝하고
co_names[namei]에 대한 값을 찾습니다. 해당 이름이 없으면LOAD_GLOBAL과 유사하게 전역 및 내장 함수에서 찾습니다. 이는 클래스 바디 내의 annotation scopes 에서 전역 변수를 로드하는 데 사용됩니다.Added in version 3.12.
- BUILD_TEMPLATE¶
문자열 튜플과 보간(interpolation) 튜플로부터 새로운
Template인스턴스를 생성하고 결과 객체를 스택에 푸시합니다.interpolations = STACK.pop() strings = STACK.pop() STACK.append(_build_template(strings, interpolations))
Added in version 3.14.
- BUILD_INTERPOLATION(format)¶
값과 그 소스 표현식으로부터 새로운
Interpolation인스턴스를 생성하고 결과 객체를 스택에 푸시합니다.변환이나 형식 지정이 없는 경우,
format은2로 설정됩니다.format의 하위 비트가 설정된 경우, 이는 보간에 형식 지정이 포함되어 있음을 나타냅니다.format >> 2``가 0이 아니면 보간에 변환이 포함되어 있음을 의미합니다. ``format >> 2``의 값은 변환 유형을 나타냅니다(변환 없음은 ``0,!s``는 ``1,!r``은 ``2,!a``는 ``3).conversion = format >> 2 if format & 1: format_spec = STACK.pop() else: format_spec = None expression = STACK.pop() value = STACK.pop() STACK.append(_build_interpolation(value, expression, conversion, format_spec))
Added in version 3.14.
- BUILD_TUPLE(count)¶
스택에서 count 개의 항목을 사용하여 튜플을 생성하고, 결과 튜플을 스택에 푸시합니다.
if count == 0: value = () else: value = tuple(STACK[-count:]) STACK = STACK[:-count] STACK.append(value)
- BUILD_LIST(count)¶
BUILD_TUPLE처럼 작동하지만, 리스트를 만듭니다.
- BUILD_SET(count)¶
BUILD_TUPLE처럼 작동하지만, 집합을 만듭니다.
- BUILD_MAP(count)¶
새 딕셔너리 객체를 스택에 푸시합니다. 딕셔너리가 count 개의 항목을 보유하도록
2 * count개의 항목을 팝합니다:{..., STACK[-4]: STACK[-3], STACK[-2]: STACK[-1]}.버전 3.5에서 변경: 딕셔너리는 count 항목을 갖도록 미리 크기가 조정된 빈 딕셔너리를 만드는 대신 스택 항목에서 만들어집니다.
- BUILD_STRING(count)¶
스택에서 count 문자열을 이어붙이고 결과 문자열을 스택으로 푸시합니다.
Added in version 3.6.
- LIST_EXTEND(i)¶
구현합니다:
seq = STACK.pop() list.extend(STACK[-i], seq)
리스트를 만드는 데 사용됩니다.
Added in version 3.9.
- SET_UPDATE(i)¶
구현합니다:
seq = STACK.pop() set.update(STACK[-i], seq)
셋을 만드는 데 사용됩니다.
Added in version 3.9.
- DICT_UPDATE(i)¶
구현합니다:
map = STACK.pop() dict.update(STACK[-i], map)
딕셔너리를 만드는 데 사용됩니다.
Added in version 3.9.
- DICT_MERGE(i)¶
DICT_UPDATE와 유사하지만, 중복 키에 대해 예외를 발생시킵니다.Added in version 3.9.
- LOAD_ATTR(namei)¶
namei의 하위 비트가 설정되지 않은 경우, 이를STACK[-1]을getattr(STACK[-1], co_names[namei>>1])로 교체합니다.namei의 하위 비트가 설정된 경우,STACK[-1]객체에서co_names[namei>>1]이라는 이름의 메서드를 로드하려고 시도합니다.STACK[-1]은 팝됩니다. 이 바이트코드는 두 가지 경우를 구분합니다. 만약STACK[-1]이 올바른 이름의 메서드를 가지고 있다면, 바이트코드는 언바운드(unbound) 메서드와STACK[-1]을 푸시합니다.STACK[-1]은 언바운드 메서드를 호출할 때CALL또는CALL_KW에 의해 첫 번째 인자(self)로 사용됩니다. 그렇지 않으면,NULL과 속성 조회를 통해 반환된 객체가 푸시됩니다.버전 3.12에서 변경:
namei의 하위 비트가 설정된 경우, 속성 또는 언바운드 메서드 앞에 각각NULL또는self가 스택에 푸시됩니다.
- LOAD_SUPER_ATTR(namei)¶
이 opcode는
super`를 구현하며, 인자가 없는 형태와 두 개의 인자가 있는 형태(예: ``super().method()`(),super().attr및super(cls, self).method(),super(cls, self).attr) 모두를 지원합니다.스택에서 세 개의 값을 팝합니다(스택 상단부터):
self: 현재 메서드의 첫 번째 인자cls: 현재 메서드가 정의된 클래스전역
super
인자와 관련하여
LOAD_ATTR과 유사하게 동작하지만,namei가 1비트가 아닌 2비트 왼쪽으로 이동합니다.namei의 하위 비트가 설정되면LOAD_ATTR과 마찬가지로 메서드 로드를 시도하며, 이는NULL과 로드된 메서드를 푸시하는 결과로 이어집니다. 설정되지 않은 경우 단일 값이 스택에 푸시됩니다.namei의 두 번째 하위 비트가 설정된 경우, 이는super()에 대한 두 개의 인자가 있는 호출을 의미합니다(설정되지 않은 경우는 인자가 없는 형태).Added in version 3.12.
- COMPARE_OP(opname)¶
불리언 연산을 수행합니다. 연산 이름은
cmp_op[opname >> 5]에서 찾을 수 있습니다. 만약opname의 다섯 번째 하위 비트가 설정된 경우(opname & 16), 결과는bool로 변환되어야 합니다.버전 3.13에서 변경: 이제 oparg의 다섯 번째 하위 비트가
bool으로 강제 변환됨을 나타냅니다.
- IS_OP(invert)¶
is비교를 수행하거나,invert가 1이면is not을 수행합니다.Added in version 3.9.
- CONTAINS_OP(invert)¶
in비교를 수행하거나,invert가 1이면not in을 수행합니다.Added in version 3.9.
- IMPORT_NAME(namei)¶
모듈
co_names[namei]를 임포트합니다.STACK[-1]과STACK[-2]는 팝되며,__import__()의 fromlist 및 level 인자를 제공합니다. 모듈 객체가 스택에 푸시됩니다. 현재 네임스페이스는 영향을 받지 않습니다. 적절한 임포트 문을 위해서는 이후의STORE_FAST명령어가 네임스페이스를 수정합니다.
- IMPORT_FROM(namei)¶
STACK[-1]에서 찾은 모듈로부터 속성co_names[namei]를 로드합니다. 결과 객체는 스택에 푸시되며, 이후STORE_FAST명령에 의해 저장됩니다.
- JUMP_FORWARD(delta)¶
바이트 코드 카운터를 delta만큼 증가시킵니다.
- JUMP_BACKWARD(delta)¶
바이트코드 카운터를 delta 만큼 감소시키고 인터럽트를 확인합니다.
Added in version 3.11.
- JUMP_BACKWARD_NO_INTERRUPT(delta)¶
바이트코드 카운터를 delta 만큼 감소시킵니다. 인터럽트를 확인하지 않습니다.
Added in version 3.11.
- POP_JUMP_IF_TRUE(delta)¶
STACK[-1]이 true인 경우 바이트코드 카운터를 delta 만큼 증가시키고,STACK[-1]을 팝합니다.버전 3.11에서 변경: oparg는 이제 절대적인 목표가 아니라 상대적 차이(delta)입니다. 이 opcode는 의사 명령어로, 최종 바이트코드에서는 방향성 있는 버전(앞으로/뒤로)으로 대체됩니다.
버전 3.12에서 변경: 이것은 더 이상 의사 명령어가 아닙니다.
버전 3.13에서 변경: 이 명령어는 이제 정확한
bool피연산자를 요구합니다.
- POP_JUMP_IF_FALSE(delta)¶
STACK[-1]이 false인 경우 바이트코드 카운터를 delta 만큼 증가시키고,STACK[-1]을 팝합니다.버전 3.11에서 변경: oparg는 이제 절대적인 목표가 아니라 상대적 차이(delta)입니다. 이 opcode는 의사 명령어로, 최종 바이트코드에서는 방향성 있는 버전(앞으로/뒤로)으로 대체됩니다.
버전 3.12에서 변경: 이것은 더 이상 의사 명령어가 아닙니다.
버전 3.13에서 변경: 이 명령어는 이제 정확한
bool피연산자를 요구합니다.
- POP_JUMP_IF_NOT_NONE(delta)¶
STACK[-1]이None이 아닌 경우 바이트코드 카운터를 delta 만큼 증가시키고,STACK[-1]을 팝합니다.Added in version 3.11.
버전 3.12에서 변경: 이것은 더 이상 의사 명령어가 아닙니다.
- POP_JUMP_IF_NONE(delta)¶
STACK[-1]이None인 경우 바이트코드 카운터를 delta 만큼 증가시키고,STACK[-1]을 팝합니다.Added in version 3.11.
버전 3.12에서 변경: 이것은 더 이상 의사 명령어가 아닙니다.
- FOR_ITER(delta)¶
STACK[-1]은 iterator 입니다. 해당 객체의__next__()메서드를 호출합니다. 새로운 값이 생성되면 이를 스택에 푸시하고(이터레이터는 그 아래에 유지), 이터레이터가 소진되었음을 나타내면 바이트코드 카운터를 delta 만큼 증가시킵니다.버전 3.12에서 변경: 3.11 버전까지는 이터레이터가 소진되면 팝되었습니다.
- LOAD_GLOBAL(namei)¶
전역 변수
co_names[namei>>1]을 스택에 로드합니다.버전 3.11에서 변경:
namei의 하위 비트가 설정되어 있으면 전역 변수 앞에NULL이 스택에 푸시됩니다.
- LOAD_FAST(var_num)¶
지역
co_varnames[var_num]에 대한 참조를 스택으로 푸시합니다.버전 3.12에서 변경: 이 옵코드는 이제 로컬 변수가 초기화되었음이 보장되는 상황에서만 사용됩니다. 이 경우
UnboundLocalError를 발생시키지 않습니다.
- LOAD_FAST_BORROW(var_num)¶
로컬
co_varnames[var_num]에 대한 빌려온 참조를 스택에 푸시합니다.Added in version 3.14.
- LOAD_FAST_LOAD_FAST(var_nums)¶
co_varnames[var_nums >> 4]및co_varnames[var_nums & 15]에 대한 참조를 스택에 푸시합니다.Added in version 3.13.
- LOAD_FAST_BORROW_LOAD_FAST_BORROW(var_nums)¶
co_varnames[var_nums >> 4]및co_varnames[var_nums & 15]에 대한 빌려온 참조를 스택에 푸시합니다.Added in version 3.14.
- LOAD_FAST_CHECK(var_num)¶
로컬
co_varnames[var_num]에 대한 참조를 스택에 푸시하며, 로컬 변수가 초기화되지 않은 경우UnboundLocalError를 발생시킵니다.Added in version 3.12.
- LOAD_FAST_AND_CLEAR(var_num)¶
로컬
co_varnames[var_num]에 대한 참조를 스택에 푸시하고(로컬 변수가 초기화되지 않은 경우NULL을 푸시함),co_varnames[var_num]을NULL으로 설정합니다.Added in version 3.12.
- STORE_FAST(var_num)¶
STACK.pop()을 로컬co_varnames[var_num]에 저장합니다.
- STORE_FAST_STORE_FAST(var_nums)¶
STACK[-1]을co_varnames[var_nums >> 4]에,STACK[-2]를co_varnames[var_nums & 15]에 저장합니다.Added in version 3.13.
- STORE_FAST_LOAD_FAST(var_nums)¶
STACK.pop()을 로컬co_varnames[var_nums >> 4]에 저장하고, 로컬co_varnames[var_nums & 15]에 대한 참조를 스택에 푸시합니다.Added in version 3.13.
- DELETE_FAST(var_num)¶
지역
co_varnames[var_num]을 삭제합니다.
- MAKE_CELL(i)¶
슬롯
i에 새로운 셀을 생성합니다. 해당 슬롯이 비어 있지 않으면 그 값을 새 셀에 저장합니다.Added in version 3.11.
- LOAD_DEREF(i)¶
“fast locals” 저장소의 슬롯
i에 포함된 셀을 로드합니다. 해당 셀이 포함하고 있는 객체에 대한 참조를 스택에 푸시합니다.버전 3.11에서 변경:
i는 더 이상co_varnames의 길이만큼 오프셋되지 않습니다.
- LOAD_FROM_DICT_OR_DEREF(i)¶
스택에서 매핑을 팝하고, 이 매핑 내에서 “fast locals” 저장소의 슬롯
i와 연관된 이름을 찾습니다. 해당 이름이 발견되지 않으면LOAD_DEREF와 유사하게 슬롯i에 포함된 셀에서 로드합니다. 이는 클래스 본문(이전에는LOAD_CLASSDEREF를 사용함) 및 클래스 본문 내의 annotation scopes 에서 closure variables 을 로드하는 데 사용됩니다.Added in version 3.12.
- STORE_DEREF(i)¶
STACK.pop()을 “fast locals” 저장소의 슬롯i에 포함된 셀에 저장합니다.버전 3.11에서 변경:
i는 더 이상co_varnames의 길이만큼 오프셋되지 않습니다.
- DELETE_DEREF(i)¶
“fast locals” 저장소의 슬롯
i에 포함된 셀을 비웁니다.del문에서 사용됩니다.Added in version 3.2.
버전 3.11에서 변경:
i는 더 이상co_varnames의 길이만큼 오프셋되지 않습니다.
- COPY_FREE_VARS(n)¶
클로저에서
n개의 자유 (클로저) 변수 를 프레임으로 복사합니다. 이를 통해 클로저 호출 시 호출자 측에서 별도의 코드가 필요하지 않게 됩니다.Added in version 3.11.
- RAISE_VARARGS(argc)¶
argc의 값에 따라,
raise문의 3가지 형식 중 하나를 사용하여 예외를 발생시킵니다:0:
raise(이전 예외를 다시 발생시킵니다)1:
raise STACK[-1](STACK[-1]에 있는 예외 인스턴스 또는 유형을 발생시킴)2:
raise STACK[-2] from STACK[-1](__cause__가STACK[-1]으로 설정된STACK[-2]의 예외 인스턴스 또는 유형을 발생시킴)
- CALL(argc)¶
argc에 지정된 수만큼의 인자를 사용하여 콜러블 객체를 호출합니다. 스택에는 다음 요소들이 (오름차순으로) 쌓여 있습니다:콜러블
self또는NULL남은 위치 인자들
argc는self를 제외한 위치 인자의 총합입니다.CALL은 모든 인자와 콜러블 객체를 스택에서 팝하고, 해당 인자들로 콜러블 객체를 호출한 다음, 콜러블 객체가 반환한 결과를 스택에 푸시합니다.Added in version 3.11.
버전 3.13에서 변경: 이제 콜러블은 항상 스택의 동일한 위치에 나타납니다.
버전 3.13에서 변경: 키워드 인자를 포함한 호출은 이제
CALL_KW에서 처리됩니다.
- CALL_KW(argc)¶
하나 이상의 명명된 인자를 포함하여
argc에 지정된 수만큼의 인자로 콜러블 객체를 호출합니다. 스택에는 다음 요소들이 (오름차순으로) 쌓여 있습니다:콜러블
self또는NULL남은 위치 인자들
명명된 인자들
키워드 인자 이름들의
tuple
argc는self를 제외한 위치 인자와 명명된 인자의 총합입니다. 키워드 인자 이름 튜플의 길이는 명명된 인자의 개수입니다.CALL_KW는 모든 인자, 키워드 이름, 콜러블 객체를 스택에서 팝하고, 해당 인자들로 콜러블 객체를 호출한 다음, 콜러블 객체가 반환한 값을 스택에 푸시합니다.Added in version 3.13.
- CALL_FUNCTION_EX(flags)¶
위치와 키워드 인자의 변수 집합으로 콜러블 객체를 호출합니다. flags의 최하위 비트가 설정되면, 스택의 맨 위에 추가 키워드 인자가 포함된 매핑 객체가 포함됩니다. 콜러블이 호출되기 전에, 매핑 객체와 이터러블 객체는 각각 “언팩” 되고 그 내용이 각각 키워드와 위치 인자로 전달됩니다.
CALL_FUNCTION_EX는 모든 인자와 콜러블 객체를 스택에서 팝하고, 해당 인자로 콜러블 객체를 호출한 다음, 콜러블 객체가 반환한 반환 값을 푸시합니다.Added in version 3.6.
- PUSH_NULL¶
스택에
NULL을 푸시합니다. 메서드가 아닌 호출의 경우LOAD_ATTR에 의해 푸시된NULL과 일치시키기 위해 호출 시퀀스에서 사용됩니다.Added in version 3.11.
- MAKE_FUNCTION¶
STACK[-1]에 있는 코드 객체로부터 생성된 새 함수 객체를 스택에 푸시합니다.버전 3.10에서 변경: 플래그 값
0x04는 딕셔너리 대신 문자열들의 튜플입니다버전 3.11에서 변경:
STACK[-1]의 한정된 이름(Qualified name)이 제거되었습니다.버전 3.13에서 변경: oparg 플래그로 표시되는 스택 위의 추가 함수 속성들이 제거되었습니다. 이제는
SET_FUNCTION_ATTRIBUTE를 사용합니다.
- SET_FUNCTION_ATTRIBUTE(flag)¶
함수 객체의 속성을 설정합니다.
STACK[-1]에 함수를,STACK[-2]에 설정할 속성 값을 기대하며, 두 값을 모두 소비하고 함수를STACK[-1]에 남겨둡니다. 플래그는 어떤 속성을 설정할지 결정합니다:0x01위치 전용과 위치-키워드 매개 변수를 위한 기본값의 위치 순서 튜플0x02키워드 전용 매개 변수의 기본값 딕셔너리0x04매개변수 어노테이션을 포함하는 문자열 튜플0x08자유 변수를 위한 셀을 포함하는 튜플, 클로저를 만듭니다0x10함수 객체의 annotate function
Added in version 3.13.
버전 3.14에서 변경: 함수 객체에 대한 annotate function을 나타내기 위해
0x10을 추가했습니다.
- BUILD_SLICE(argc)¶
스택에 슬라이스 객체를 푸시합니다. argc 는 2 또는 3이어야 합니다. 2인 경우, 다음을 구현합니다:
end = STACK.pop() start = STACK.pop() STACK.append(slice(start, end))
3인 경우, 다음을 구현합니다:
step = STACK.pop() end = STACK.pop() start = STACK.pop() STACK.append(slice(start, end, step))
자세한 정보는
slice()내장 함수를 참조하십시오.
- EXTENDED_ARG(ext)¶
너무 커서 기본 1바이트에 맞지 않는 인자를 가진 옵코드에 접두어로 붙입니다. ext는 인자에서 더 높은 비트로 작동하는 추가 바이트를 보유합니다. 각 옵코드마다, 최대 3개의 접두사
EXTENDED_ARG가 허용되며, 2바이트에서 4바이트 사이의 인자를 형성합니다.
- CONVERT_VALUE(oparg)¶
oparg에 따라 값을 문자열로 변환합니다:value = STACK.pop() result = func(value) STACK.append(result)
oparg == 1: value 에 대해str()을 호출oparg == 2: value 에 대해repr()을 호출oparg == 3: value 에 대해ascii()를 호출
포맷 문자열 리터럴(f-string)을 구현하는 데 사용됩니다.
Added in version 3.13.
- FORMAT_SIMPLE¶
스택 최상단의 값을 포맷합니다:
value = STACK.pop() result = value.__format__("") STACK.append(result)
포맷 문자열 리터럴(f-string)을 구현하는 데 사용됩니다.
Added in version 3.13.
- FORMAT_WITH_SPEC¶
주어진 값에 주어진 포맷 사양을 적용하여 포맷합니다:
spec = STACK.pop() value = STACK.pop() result = value.__format__(spec) STACK.append(result)
포맷 문자열 리터럴(f-string)을 구현하는 데 사용됩니다.
Added in version 3.13.
- MATCH_CLASS(count)¶
STACK[-1]은 키워드 속성 이름의 튜플이고,STACK[-2]는 비교 대상 클래스이며,STACK[-3]은 일치 여부를 확인할 대상입니다. count 는 위치 하위 패턴의 수입니다.STACK[-1],STACK[-2],STACK[-3]을 팝합니다.STACK[-3]이STACK[-2]의 인스턴스이며 count 와STACK[-1]에 의해 요구되는 위치 및 키워드 속성을 갖춘 경우 추출된 속성의 튜플을 푸시합니다. 그렇지 않으면None을 푸시합니다.Added in version 3.10.
버전 3.11에서 변경: 이전에는 이 명령어가 성공(
True) 또는 실패(False)를 나타내는 불리언 값을 함께 푸시했습니다.
- RESUME(context)¶
아무 작업도 수행하지 않는(no-op) 연산입니다. 내부 추적, 디버깅 및 최적화 확인을 수행합니다.
context피연산자는 두 부분으로 구성됩니다. 하위 2비트는RESUME이 발생하는 위치를 나타냅니다:0제너레이터, 코루틴 또는 비동기 제너레이터가 아닌 함수의 시작점1yield표현식 이후2yield from표현식 이후3await표현식 이후
다음 비트는 RESUME이 예외 깊이(except-depth)
1에 위치하면1, 그렇지 않으면0입니다.Added in version 3.11.
버전 3.13에서 변경: oparg 값이 예외 깊이에 대한 정보를 포함하도록 변경되었습니다.
- RETURN_GENERATOR¶
현재 프레임으로부터 제너레이터, 코루틴 또는 비동기 제너레이터를 생성합니다. 위에서 언급한 콜러블들의 코드 객체 내 첫 번째 옵코드로 사용됩니다. 현재 프레임을 정리하고 새로 생성된 제너레이터를 반환합니다.
Added in version 3.11.
- SEND(delta)¶
STACK[-1] = STACK[-2].send(STACK[-1])``와 동일합니다. ``yield from및await문에서 사용됩니다.호출 시
StopIteration이 발생하는 경우, 스택 상단의 값을 팝하고 예외의value속성을 푸시하며 바이트코드 카운터를 delta 만큼 증가시킵니다.Added in version 3.11.
- HAVE_ARGUMENT¶
이것은 엄밀히 말해 옵코드가 아닙니다. 이는 0~255 범위의 옵코드 중 인자를 사용하지 않는 것과 사용하는 것을 구분하는 경계(각각
< HAVE_ARGUMENT및>= HAVE_ARGUMENT)를 식별합니다.애플리케이션에서 의사 명령(pseudo instructions) 또는 특수 명령을 사용하는 경우 대신
hasarg컬렉션을 사용하십시오.버전 3.6에서 변경: 이제 모든 명령어에는 인자가 있지만,
< HAVE_ARGUMENT인 옵코드는 이를 무시합니다. 이전에는,>= HAVE_ARGUMENT인 옵코드에만 인자가 있었습니다.버전 3.12에서 변경: 의사 명령이
dis모듈에 추가되었으며, 이 경우HAVE_ARGUMENT와 비교하여 인자 사용 여부를 판단하는 것이 유효하지 않습니다.버전 3.13부터 폐지됨:
hasarg대신 사용하십시오.
- CALL_INTRINSIC_1¶
하나의 인자를 가진 내장 함수를 호출합니다.
STACK[-1]을 인자로 전달하고STACK[-1]에 결과를 설정합니다. 성능이 매우 중요하지 않은 기능을 구현하는 데 사용됩니다.피연산자는 어떤 내장 함수가 호출되는지 결정합니다:
피연산자
설명
INTRINSIC_1_INVALID유효하지 않음
INTRINSIC_PRINT인자를 표준 출력으로 인쇄합니다. REPL에서 사용됩니다.
INTRINSIC_IMPORT_STAR해당 모듈에 대해
import *를 수행합니다.INTRINSIC_STOPITERATION_ERRORStopIteration예외에서 반환 값을 추출합니다.INTRINSIC_ASYNC_GEN_WRAP비동기 제너레이터 값을 래핑합니다
INTRINSIC_UNARY_POSITIVE단항
+연산을 수행합니다INTRINSIC_LIST_TO_TUPLE리스트를 튜플로 변환합니다
INTRINSIC_TYPEVARtyping.TypeVar을 생성합니다INTRINSIC_PARAMSPECtyping.ParamSpec을 생성합니다.INTRINSIC_TYPEVARTUPLEtyping.TypeVarTuple을 생성합니다.INTRINSIC_SUBSCRIPT_GENERIC인자로 인덱싱된
typing.Generic을 반환합니다.INTRINSIC_TYPEALIAStyping.TypeAliasType을 생성합니다. 이는type문에서 사용됩니다. 인자는 타입 별칭의 이름, 타입 파라미터, 값으로 구성된 튜플입니다.Added in version 3.12.
- CALL_INTRINSIC_2¶
두 개의 인수를 사용하여 내장 함수를 호출합니다. 성능이 중요하지 않은 기능을 구현하는 데 사용됩니다:
arg2 = STACK.pop() arg1 = STACK.pop() result = intrinsic2(arg1, arg2) STACK.append(result)
피연산자는 어떤 내장 함수가 호출되는지 결정합니다:
피연산자
설명
INTRINSIC_2_INVALID유효하지 않음
INTRINSIC_PREP_RERAISE_STARtry-except*에서 발생시킬ExceptionGroup을 계산합니다.INTRINSIC_TYPEVAR_WITH_BOUND바인딩이 있는
typing.TypeVar을 생성합니다.INTRINSIC_TYPEVAR_WITH_CONSTRAINTS제약 조건이 있는
typing.TypeVar을 생성합니다.INTRINSIC_SET_FUNCTION_TYPE_PARAMS함수의
__type_params__어트리뷰트를 설정합니다.Added in version 3.12.
- LOAD_SPECIAL¶
STACK[-1]에 대한 특수 메서드 조회를 수행합니다. 만약type(STACK[-1]).__xxx__가 메서드라면, 스택에type(STACK[-1]).__xxx__; STACK[-1]를 남깁니다.type(STACK[-1]).__xxx__이 메서드가 아니라면, 스택에STACK[-1].__xxx__; NULL을 남깁니다.Added in version 3.14.
의사 명령어
이 옵코드들은 파이썬 바이트코드에 나타나지 않습니다. 컴파일러에서 사용되지만, 바이트코드가 생성되기 전에 실제 옵코드로 교체되거나 제거됩니다.
- SETUP_FINALLY(target)¶
다음 코드 블록에 대한 예외 처리기를 설정합니다. 예외가 발생하면 값 스택 레벨이 현재 상태로 복구되고 제어권이
target의 예외 처리기로 전달됩니다.
- SETUP_CLEANUP(target)¶
SETUP_FINALLY와 유사하지만, 예외 발생 시RERAISE가 복구할 수 있도록 마지막 명령어(lasti)를 스택에 푸시합니다. 예외가 발생하면 값 스택 레벨과 프레임의 마지막 명령어가 현재 상태로 복구되고 제어권이target의 예외 처리기로 전달됩니다.
- SETUP_WITH(target)¶
SETUP_CLEANUP과 유사하지만, 예외 발생 시 제어권이target의 예외 처리기로 전달되기 전에 스택에서 항목 하나를 더 팝(pop)합니다.이 변형은 컨텍스트 관리자의
__enter__()또는__aenter__()의 반환 값을 스택에 푸시하는with및async with구문에서 사용됩니다.
- POP_BLOCK¶
마지막
SETUP_FINALLY,SETUP_CLEANUP또는SETUP_WITH와 관련된 코드 블록의 끝을 표시합니다.
- JUMP_IF_TRUE¶
- JUMP_IF_FALSE¶
스택에 영향을 주지 않는 조건부 점프입니다.
COPY 1,TO_BOOL,POP_JUMP_IF_TRUE/FALSE시퀀스로 대체됩니다.
- LOAD_CLOSURE(i)¶
“fast locals” 저장소의 슬롯
i에 포함된 셀에 대한 참조를 푸시합니다.어셈블러에서
LOAD_CLOSURE가LOAD_FAST로 교체됨을 유의하십시오.버전 3.13에서 변경: 이 옵코드는 이제 의사 명령어입니다.
옵코드 모음¶
이 모음은 바이트 코드 명령어의 자동 검사를 위해 제공됩니다:
버전 3.12에서 변경: 이제 컬렉션에 의사 명령어와 계측된 명령어가 포함됩니다. 이들은 값이 각각 >= MIN_PSEUDO_OPCODE 및 >= MIN_INSTRUMENTED_OPCODE 인 옵코드입니다.
- dis.opname¶
연산 이름의 시퀀스, 바이트 코드를 사용하여 인덱싱할 수 있습니다.
- dis.opmap¶
연산 이름을 바이트 코드로 매핑하는 딕셔너리.
- dis.cmp_op¶
모든 비교 연산 이름의 시퀀스.
- dis.hasarg¶
자신의 인수를 사용하는 바이트코드 시퀀스입니다.
Added in version 3.12.
- dis.hasconst¶
상수에 액세스하는 바이트 코드의 시퀀스.
- dis.hasfree¶
바이트코드 시퀀스가 free (closure) 변수 에 액세스합니다. 여기서 ‘free’는 현재 스코프 내에서 내부 스코프가 참조하는 이름이나, 현재 스코프에서 외부 스코프의 이름을 참조하는 경우를 의미합니다. 전역 또는 내장 범위에 대한 참조는 포함되지 않습니다.
- dis.hasname¶
어트리뷰트를 이름으로 액세스하는 바이트 코드의 시퀀스.
- dis.hasjump¶
점프 대상이 있는 바이트코드 시퀀스입니다. 모든 점프는 상대적입니다.
Added in version 3.13.
- dis.haslocal¶
지역 변수에 액세스하는 바이트 코드의 시퀀스.
- dis.hascompare¶
불리언 연산의 바이트 코드의 시퀀스.
- dis.hasexc¶
예외 처리기를 설정하는 바이트코드 시퀀스입니다.
Added in version 3.12.
- dis.hasjabs¶
절대 점프 대상이 있는 바이트 코드의 시퀀스.
버전 3.13부터 폐지됨: 이제 모든 점프가 상대적입니다. 이 목록은 비어 있습니다.