Python

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 인수가 추가되었습니다.

버전 3.14에서 변경: -P 명령 줄 옵션과 show_positions 인수가 추가되었습니다.

-S 명령 줄 옵션이 추가되었습니다.

예제: 함수 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_lineNone이 아니면, 역 어셈블 된 코드에서 첫 번째 소스 줄에 대해 보고해야 하는 줄 번호를 나타냅니다. 그렇지 않으면, 소스 줄 정보(있다면)를 역 어셈블 된 코드 객체에서 직접 취합니다.

current_offsetNone이 아니면, 역 어셈블 된 코드의 명령어 오프셋을 나타냅니다. 이를 설정하면, dis()가 지정된 옵코드(opcode)에 대해 “현재 명령어” 마커를 표시합니다.

show_cachesTrue 이면, dis() 는 인터프리터가 바이트 코드를 특수화(specialize)하는 데 사용하는 인라인 캐시 항목을 표시합니다.

adaptiveTrue 이면, dis() 는 원본 바이트 코드와 다를 수 있는 특수화된 바이트 코드를 표시합니다.

show_offsetsTrue 이면, dis() 는 출력에 명령어 오프셋을 포함합니다.

show_positionsTrue 이면, dis() 는 출력에 명령어의 소스 코드 위치를 포함합니다.

show_jitTrue 이면, dis() 는 기본적으로 숨겨져 있는 JIT 진입점을 표시하는 ENTER_EXECUTOR 명령어를 보여줍니다.

classmethod from_traceback(tb, *, show_caches=False)

주어진 트레이스백에서 Bytecode 인스턴스를 구성하고, current_offset을 예외를 일으킨 명령어로 설정합니다.

codeobj

컴파일된 코드 객체.

first_line

코드 객체의 첫 번째 소스 줄 (사용 가능하다면)

dis()

바이트 코드 연산의 포맷된 보기를 반환합니다 (dis.dis()가 인쇄하는 것과 같지만, 여러 줄 문자열로 반환됩니다).

info()

code_info()처럼, 코드 객체에 대한 자세한 정보가 포함된 포맷된 여러 줄 문자열을 반환합니다.

버전 3.7에서 변경: 이제 코루틴과 비동기 제너레이터 객체를 처리할 수 있습니다.

버전 3.11에서 변경: show_cachesadaptive 매개변수가 추가되었습니다.

버전 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_cachesTrue 이면 이 함수는 인터프리터가 바이트 코드를 특수화하는 데 사용하는 인라인 캐시 항목을 표시합니다.

adaptiveTrue 이면 이 함수는 원본 바이트 코드와 다를 수 있는 특수화된 바이트 코드를 표시합니다.

show_jitTrue 이면 이 함수는 기본적으로 숨겨져 있는 JIT 진입점을 나타내는 ENTER_EXECUTOR 명령어를 보여줍니다.

버전 3.4에서 변경: file 매개 변수를 추가했습니다.

버전 3.7에서 변경: 재귀 역 어셈블을 구현하고 depth 매개 변수를 추가했습니다.

버전 3.7에서 변경: 이제 코루틴과 비동기 제너레이터 객체를 처리할 수 있습니다.

버전 3.11에서 변경: show_cachesadaptive 매개변수가 추가되었습니다.

버전 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_cachesadaptive 매개변수가 추가되었습니다.

버전 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가 제공되면 마지막 명령어를 표시합니다. 출력은 다음 열로 나뉩니다:

  1. 명령어의 소스 코드 위치입니다. show_positions 가 참이면 전체 위치 정보가 표시되고, 그렇지 않으면(기본값) 줄 번호만 표시됩니다.

  2. 현재 명령어, -->로 표시됩니다,

  3. 레이블이 있는 명령어, >>로 표시됩니다,

  4. 명령어의 주소,

  5. 연산 코드 이름,

  6. 연산 매개 변수, 그리고

  7. 괄호 안에 있는 매개 변수의 해석.

매개 변수 해석은 지역과 전역 변수 이름, 상숫값, 분기 대상 및 비교 연산자를 인식합니다.

역 어셈블리는 제공된다면 제공된 file 인자에, 그렇지 않으면 sys.stdout에 텍스트로 기록됩니다.

버전 3.4에서 변경: file 매개 변수를 추가했습니다.

버전 3.11에서 변경: show_cachesadaptive 매개변수가 추가되었습니다.

버전 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_lineNone이 아니면, 역 어셈블 된 코드에서 첫 번째 소스 줄에 대해 보고해야 하는 줄 번호를 나타냅니다. 그렇지 않으면, 소스 줄 정보(있다면)를 역 어셈블 된 코드 객체에서 직접 취합니다.

adaptive 매개변수는 dis() 에서와 동일하게 작동합니다.

show_jit 매개변수는 dis() 에서와 동일하게 작동합니다.

Added in version 3.4.

버전 3.11에서 변경: show_cachesadaptive 매개변수가 추가되었습니다.

버전 3.13에서 변경: show_caches 매개변수는 폐지되어 아무런 효과가 없습니다. 반복자는 show_caches 값에 관계없이 cache_info 필드가 채워진 Instruction 인스턴스를 생성하며, 더 이상 캐시 항목에 대한 별도의 항목을 생성하지 않습니다.

버전 3.16.0a0 (unreleased)에서 변경: show_jit 매개변수가 추가되었습니다.

dis.findlinestarts(code)

이 제너레이터 함수는 code object codeco_lines() 메서드를 사용하여 소스 코드의 줄 시작 오프셋을 찾습니다. 이들은 (offset, lineno) 쌍으로 생성됩니다.

버전 3.6에서 변경: 줄 번호가 줄어들 수 있습니다. 전에는, 언제나 증가했습니다.

버전 3.10에서 변경: code objectco_firstlinenocodeobject.co_lnotab 속성 대신 PEP 626 co_lines() 메서드가 사용됩니다.

버전 3.13에서 변경: 소스 줄과 매핑되지 않는 바이트 코드의 경우 줄 번호가 None 일 수 있습니다.

dis.findlabels(code)

원시 컴파일된 바이트 코드 문자열 code에서 점프 대상인 모든 오프셋을 감지하고, 이러한 오프셋의 리스트를 반환합니다.

dis.stack_effect(opcode, oparg=None, *, jump=None)

인자 oparg를 갖는 opcode의 스택 효과를 계산합니다.

코드에 점프 대상이 있고 jumpTrue이면, stack_effect()는 점프의 스택 효과를 반환합니다. jumpFalse이면, 점프하지 않는 스택 효과를 반환합니다. jumpNone(기본값)이면, 두 경우의 최대 스택 효과를 반환합니다.

Added in version 3.4.

버전 3.8에서 변경: jump 매개 변수를 추가했습니다.

버전 3.13에서 변경: oparg 이 생략되거나 None 인 경우, 이제 oparg=0 에 대해 스택 효과가 반환됩니다. 이전에는 인수를 사용하는 옵코드의 경우 오류로 처리되었습니다. 또한 opcode 가 인수를 사용하지 않을 때 정수 oparg 를 전달해도 더 이상 오류가 발생하지 않으며, 이 경우 해당 oparg 은 무시됩니다.

파이썬 바이트 코드 명령어

get_instructions() 함수와 Bytecode 클래스는 바이트 코드 명령어의 세부 사항을 Instruction 인스턴스로 제공합니다:

class dis.Instruction

바이트 코드 연산에 대한 세부 사항

opcode

연산의 숫자 코드, 아래 나열된 옵코드 값과 옵코드 모음에 있는 바이트 코드 값에 해당합니다.

opname

연산의 사람이 읽을 수 있는 이름

baseopcode

작업이 특수화된 경우 기본 작업에 대한 숫자 코드이며, 그렇지 않으면 opcode 과 동일합니다.

baseopname

작업이 특수화된 경우 기본 작업에 대한 읽기 쉬운 이름이며, 그렇지 않으면 opname 과 동일합니다.

arg

연산에 대한 숫자 인자 (있다면), 그렇지 않으면 None

oparg

arg 의 별칭입니다.

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) 형태의 삼중항입니다. 여기서 namesize 는 캐시 형식을 설명하며 데이터는 캐시 내용입니다. 명령어가 캐시를 가지고 있지 않으면 cache_infoNone 입니다.

Added in version 3.4.

버전 3.11에서 변경: positions 필드가 추가되었습니다.

버전 3.13에서 변경: starts_line 필드가 변경되었습니다.

start_offset, cache_offset, end_offset, baseopname, baseopcode, jump_target, oparg, line_numbercache_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_LEFTBRANCH_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_NOT

STACK[-1] = not STACK[-1] 를 구현합니다.

버전 3.13에서 변경: 이 명령어는 이제 정확한 bool 피연산자를 요구합니다.

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, implements STACK[-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_APPENDMAP_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_flagsPy_TPFLAGS_MAPPING 플래그가 설정된 경우) 스택에 True 를 푸시합니다. 그렇지 않으면 False 를 푸시합니다.

Added in version 3.10.

MATCH_SEQUENCE

STACK[-1]collections.abc.Sequence 의 인스턴스이고, str/bytes/bytearray 의 인스턴스가 아닌 경우(또는 더 정확하게는, tp_flagsPy_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() 을 구현합니다. nameicode objectco_names 속성에서 name 의 인덱스입니다. 컴파일러는 가능한 경우 STORE_FAST 또는 STORE_GLOBAL 을 사용하려고 시도합니다.

DELETE_NAME(namei)

del name 을 구현하며, 여기서 nameicode objectco_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

여기서 nameicode objectco_names 에서 name의 인덱스입니다.

DELETE_ATTR(namei)

구현합니다:

obj = STACK.pop()
del obj.name

여기서 nameicode objectco_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_DEREFLOAD_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 인스턴스를 생성하고 결과 객체를 스택에 푸시합니다.

변환이나 형식 지정이 없는 경우, format2 로 설정됩니다.

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().attrsuper(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__()fromlistlevel 인자를 제공합니다. 모듈 객체가 스택에 푸시됩니다. 현재 네임스페이스는 영향을 받지 않습니다. 적절한 임포트 문을 위해서는 이후의 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

  • 남은 위치 인자들

argcself 를 제외한 위치 인자의 총합입니다.

CALL 은 모든 인자와 콜러블 객체를 스택에서 팝하고, 해당 인자들로 콜러블 객체를 호출한 다음, 콜러블 객체가 반환한 결과를 스택에 푸시합니다.

Added in version 3.11.

버전 3.13에서 변경: 이제 콜러블은 항상 스택의 동일한 위치에 나타납니다.

버전 3.13에서 변경: 키워드 인자를 포함한 호출은 이제 CALL_KW 에서 처리됩니다.

CALL_KW(argc)

하나 이상의 명명된 인자를 포함하여 argc 에 지정된 수만큼의 인자로 콜러블 객체를 호출합니다. 스택에는 다음 요소들이 (오름차순으로) 쌓여 있습니다:

  • 콜러블

  • self 또는 NULL

  • 남은 위치 인자들

  • 명명된 인자들

  • 키워드 인자 이름들의 tuple

argcself 를 제외한 위치 인자와 명명된 인자의 총합입니다. 키워드 인자 이름 튜플의 길이는 명명된 인자의 개수입니다.

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] 의 인스턴스이며 countSTACK[-1] 에 의해 요구되는 위치 및 키워드 속성을 갖춘 경우 추출된 속성의 튜플을 푸시합니다. 그렇지 않으면 None 을 푸시합니다.

Added in version 3.10.

버전 3.11에서 변경: 이전에는 이 명령어가 성공(True) 또는 실패(False)를 나타내는 불리언 값을 함께 푸시했습니다.

RESUME(context)

아무 작업도 수행하지 않는(no-op) 연산입니다. 내부 추적, 디버깅 및 최적화 확인을 수행합니다.

context 피연산자는 두 부분으로 구성됩니다. 하위 2비트는 RESUME 이 발생하는 위치를 나타냅니다:

  • 0 제너레이터, 코루틴 또는 비동기 제너레이터가 아닌 함수의 시작점

  • 1 yield 표현식 이후

  • 2 yield from 표현식 이후

  • 3 await 표현식 이후

다음 비트는 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 fromawait 문에서 사용됩니다.

호출 시 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_ERROR

StopIteration 예외에서 반환 값을 추출합니다.

INTRINSIC_ASYNC_GEN_WRAP

비동기 제너레이터 값을 래핑합니다

INTRINSIC_UNARY_POSITIVE

단항 + 연산을 수행합니다

INTRINSIC_LIST_TO_TUPLE

리스트를 튜플로 변환합니다

INTRINSIC_TYPEVAR

typing.TypeVar 을 생성합니다

INTRINSIC_PARAMSPEC

typing.ParamSpec 을 생성합니다.

INTRINSIC_TYPEVARTUPLE

typing.TypeVarTuple 을 생성합니다.

INTRINSIC_SUBSCRIPT_GENERIC

인자로 인덱싱된 typing.Generic 을 반환합니다.

INTRINSIC_TYPEALIAS

typing.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_STAR

try-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__() 의 반환 값을 스택에 푸시하는 withasync with 구문에서 사용됩니다.

POP_BLOCK

마지막 SETUP_FINALLY, SETUP_CLEANUP 또는 SETUP_WITH 와 관련된 코드 블록의 끝을 표시합니다.

JUMP
JUMP_NO_INTERRUPT

어셈블러에 의해 방향성(앞/뒤)이 있는 대응 옵코드로 교체되는 비방향적 상대 점프 명령입니다.

JUMP_IF_TRUE
JUMP_IF_FALSE

스택에 영향을 주지 않는 조건부 점프입니다. COPY 1, TO_BOOL, POP_JUMP_IF_TRUE/FALSE 시퀀스로 대체됩니다.

LOAD_CLOSURE(i)

“fast locals” 저장소의 슬롯 i 에 포함된 셀에 대한 참조를 푸시합니다.

어셈블러에서 LOAD_CLOSURELOAD_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.hasjrel

상대 점프 대상이 있는 바이트 코드의 시퀀스.

버전 3.13부터 폐지됨: 이제 모든 점프가 상대적입니다. hasjump 를 사용하십시오.

dis.hasjabs

절대 점프 대상이 있는 바이트 코드의 시퀀스.

버전 3.13부터 폐지됨: 이제 모든 점프가 상대적입니다. 이 목록은 비어 있습니다.

분실물 보관소