Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬 코드 객체(Code Object)란? 개념과 주요 속성 완벽 정리

코드 객체(Code Object)는 CPython 구현 내부의 저수준(low-level) 세부 요소입니다. 각 코드 객체는 아직 함수에 바인딩되지 않은 실행 가능한 코드 조각 하나를 나타냅니다. 코드 객체가 실행 가능한 코드를 담고 있기는 하지만, 그 자체로는 직접 호출할 수 없습니다. 코드 객체를 실제로 실행하려면 exec() 내장 함수를 사용해야 합니다.

코드 객체는 파이썬 내장 함수인 compile()을 통해 생성할 수 있습니다. compile(소스코드, 파일명, 모드) 형태로 호출하며, 문자열로 된 소스 코드를 컴파일하여 코드 객체를 반환합니다.

아래 예제에서는 주어진 코드로부터 코드 객체가 어떻게 생성되는지, 그리고 해당 코드 객체와 연관된 다양한 속성들은 무엇이 있는지 살펴보겠습니다.

예제

code_str = """
print("Hello Code Objects")
"""
# 코드 객체 생성
code_obj = compile(code_str, '<string>', 'exec')
# 코드 객체 출력
print(code_obj)
# 코드 객체의 속성 목록 확인
print(dir(code_obj))
# 컴파일된 파일 이름
print(code_obj.co_filename)
# 첫 번째 원시 바이트코드(raw bytecode)
print(code_obj.co_code)
# 변수 이름들
print(code_obj.co_varnames)

주요 속성 설명

  • co_filename: 코드가 컴파일될 때 사용된 파일 이름입니다. 위 예제에서는 문자열로부터 컴파일되었으므로 <string>이 출력됩니다.
  • co_code: 실제 실행되는 원시 바이트코드를 바이트(bytes) 형태로 담고 있습니다. 파이썬 인터프리터가 이 바이트코드를 해석하여 실행합니다.
  • co_varnames: 코드 블록 내 지역 변수들의 이름을 튜플(tuple) 형태로 저장합니다. 위 예제에는 변수가 없으므로 빈 튜플 ()이 반환됩니다.
  • co_consts, co_argcount, co_firstlineno 등 그 외에도 상수 목록, 인자 개수, 시작 줄 번호 등 다양한 메타 정보를 속성으로 제공합니다.

실행 결과

위 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.

<code object <module> at 0x000001D80557EF50, file "<string>", line 2>
['__class__', '__delattr__', '__dir__', '__doc__', ……., '__subclasshook__', 'co_argcount', 'co_cellvars', 'co_code', 'co_consts', 'co_filename', 'co_firstlineno', …..,posonlyargcount', 'co_stacksize', 'co_varnames', 'replace']
<string>
b'e\x00d\x00\x83\x01\x01\x00d\x01S\x00'
()

출력 결과에서 볼 수 있듯이, 코드 객체는 <module>이라는 이름과 함께 메모리 주소, 파일 정보, 시작 줄 번호를 포함하여 표현됩니다. 이렇게 생성된 코드 객체는 exec(code_obj)를 호출함으로써 비로소 실제로 실행됩니다.