symtable — 컴파일러의 심볼 테이블 접근

symtable — 컴파일러의 심볼 테이블 접근

심볼 테이블은 bytecode가 생성되기 직전에 컴파일러에 의해 AST에서 생성됩니다. 심볼 테이블은 코드의 모든 식별자의 범위(scope)를 계산하는 책임이 있습니다. symtable은 이러한 테이블을 검사하기 위한 인터페이스를 제공합니다.

출처: Python documentation

본문

심볼 테이블 생성

symtable.symtable(code, filename, compile_type)

Python 소스 코드에 대한 최상위 SymbolTable을 반환합니다. filename은 코드를 포함하는 파일의 이름입니다. compile_typecompile()mode 인자와 같습니다.

심볼 테이블 검사

symtable.SymbolTableType

SymbolTable 객체의 유형을 나타내는 열거형입니다.

  • MODULE — 모듈의 심볼 테이블에 사용됩니다.
  • FUNCTION — 함수의 심볼 테이블에 사용됩니다.
  • CLASS — 클래스의 심볼 테이블에 사용됩니다.

다음 멤버들은 다양한 종류의 주석(annotation) 범위를 가리킵니다.

  • ANNOTATIONfrom __future__ import annotations가 활성화되어 있으면 주석에 사용됩니다.
  • TYPE_ALIAS — 타입 구성의 심볼 테이블에 사용됩니다.
  • TYPE_PARAMETERS — 제네릭 함수나 제네릭 클래스의 심볼 테이블에 사용됩니다.
  • TYPE_VARIABLE — 형식적 의미에서 단일 타입 변수(즉, TypeVar, TypeVarTuple 또는 ParamSpec 객체 — 후자 두 개는 바운드나 제약 튜플을 지원하지 않음)의 바운드, 제약 튜플 또는 기본값의 심볼 테이블에 사용됩니다.

versionadded: 3.13.

symtable.SymbolTable

블록을 위한 네임스페이스 테이블입니다. 생성자는 공개되지 않습니다.

  • get_type() — 심볼 테이블의 유형을 반환합니다. 가능한 값은 SymbolTableType 열거형의 멤버입니다.

    versionchanged: 3.12에서 'annotation', 'TypeVar bound', 'type alias', 'type parameter'가 가능한 반환 값으로 추가되었습니다. versionchanged: 3.13에서 반환 값은 SymbolTableType 열거형의 멤버입니다. 반환된 문자열의 정확한 값은 미래에 변경될 수 있으므로 하드코딩된 문자열 대신 SymbolTableType 멤버를 사용하는 것이 좋습니다.

  • get_id() — 테이블의 식별자를 반환합니다.
  • get_name() — 테이블의 이름을 반환합니다. 테이블이 클래스용이면 클래스의 이름, 함수용이면 함수의 이름, 테이블이 전역이면(get_type()'module'을 반환) 'top'입니다. 타입 매개변수 범위(제네릭 클래스, 함수, 타입 별칭에 사용)에서는 기저의 클래스, 함수 또는 타입 별칭의 이름입니다. 타입 별칭 범위에서는 타입 별칭의 이름입니다. TypeVar 바운드 범위에서는 TypeVar의 이름입니다.
  • get_lineno() — 이 테이블이 나타내는 블록의 첫 번째 줄 번호를 반환합니다.
  • is_optimized() — 이 테이블의 로컬 변수를 최적화할 수 있으면 True를 반환합니다.
  • is_nested() — 블록이 중첩된 클래스나 함수이면 True를 반환합니다.
  • has_children() — 블록 안에 중첩된 네임스페이스가 있으면 True를 반환합니다. 이들은 get_children()으로 얻을 수 있습니다.
  • get_identifiers() — 테이블의 심볼 이름을 포함하는 뷰 객체를 반환합니다. 뷰 객체에 대한 문서를 참고하세요.
  • lookup(name) — 테이블에서 name을 조회하고 Symbol 인스턴스를 반환합니다.
  • get_symbols() — 테이블의 이름에 대한 Symbol 인스턴스 목록을 반환합니다.
  • get_children() — 중첩된 심볼 테이블 목록을 반환합니다.

symtable.Function

함수나 메서드를 위한 네임스페이스입니다. 이 클래스는 SymbolTable에서 상속합니다.

  • get_parameters() — 이 함수의 매개변수 이름을 포함하는 튜플을 반환합니다.
  • get_locals() — 이 함수의 로컬 변수 이름을 포함하는 튜플을 반환합니다.
  • get_globals() — 이 함수의 전역 변수 이름을 포함하는 튜플을 반환합니다.
  • get_nonlocals() — 이 함수에서 명시적으로 선언된 nonlocal 변수 이름을 포함하는 튜플을 반환합니다.
  • get_frees() — 이 함수의 자유(클로저) 변수 이름을 포함하는 튜플을 반환합니다.

symtable.Class

클래스의 네임스페이스입니다. 이 클래스는 SymbolTable에서 상속합니다.

  • get_methods() — 클래스에서 선언된 메서드형 함수의 이름을 포함하는 튜플을 반환합니다.
    • 여기서 '메서드'라는 용어는 클래스 본문에서 def 또는 async def를 통해 정의된 모든 함수를 지정합니다.
    • 더 깊은 범위(예: 내부 클래스)에서 정의된 함수는 get_methods()에 포함되지 않습니다.
    • 예제:
      >>> import symtable
      >>> st = symtable.symtable('''
      ... def outer(): pass
      ...
      ... class A:
      ...    def f():
      ...        def w(): pass
      ...
      ...    def g(self): pass
      ...
      ...    @classmethod
      ...    async def h(cls): pass
      ...
      ...    global outer
      ...    def outer(self): pass
      ... ''', 'test', 'exec')
      >>> class_A = st.get_children()[2]
      >>> class_A.get_methods()
      ('f', 'g', 'h')
      
    • 비록 A().f()가 런타임에 TypeError를 발생시키더라도 A.f는 여전히 메서드형 함수로 간주됩니다.
    • 3.14부터 폐기되었으며 3.16에서 제거될 예정입니다.

symtable.Symbol

소스의 식별자에 해당하는 SymbolTable의 항목입니다. 생성자는 공개되지 않습니다.

  • get_name() — 심볼의 이름을 반환합니다.
  • is_referenced() — 심볼이 그 블록에서 사용되면 True를 반환합니다.
  • is_imported() — 심볼이 import 문에서 생성되면 True를 반환합니다.
  • is_parameter() — 심볼이 매개변수이면 True를 반환합니다.
  • is_type_parameter() — 심볼이 타입 매개변수이면 True를 반환합니다.

    versionadded: 3.14.

  • is_global() — 심볼이 전역이면 True를 반환합니다.
  • is_nonlocal() — 심볼이 nonlocal이면 True를 반환합니다.
  • is_declared_global() — 심볼이 global 문으로 전역으로 선언되면 True를 반환합니다.
  • is_local() — 심볼이 자신의 블록에 국한되면 True를 반환합니다.
  • is_annotated() — 심볼이 주석 처리되었으면 True를 반환합니다.

    versionadded: 3.6.

  • is_free() — 심볼이 블록에서 참조되지만 할당되지 않으면 True를 반환합니다.
  • is_free_class() — 클래스 범위 심볼이 메서드 관점에서 자유(free)이면 True를 반환합니다.
    • 다음 예제를 고려하세요:
      def f():
          x = 1  # function-scoped
          class C:
              x = 2  # class-scoped
              def method(self):
                  return x
      
    • 이 예제에서 클래스 범위 심볼 xC.method 관점에서 자유로 간주되어, 후자가 런타임에 2가 아닌 1을 반환할 수 있게 합니다.

    versionadded: 3.14.

  • is_assigned() — 심볼이 블록에서 할당되면 True를 반환합니다.
  • is_comp_iter() — 심볼이 컴프리헨션 반복 변수이면 True를 반환합니다.

    versionadded: 3.14.

  • is_comp_cell() — 심볼이 인라인 컴프리헨션의 셀이면 True를 반환합니다.

    versionadded: 3.14.

  • is_namespace() — 이름 바인딩이 새 네임스페이스를 도입하면 True를 반환합니다.
    • 이름이 함수나 클래스 문의 대상으로 사용되면 참(true)입니다.
    • 예제:
      >>> table = symtable.symtable("def some_func(): pass", "string", "exec")
      >>> table.lookup("some_func").is_namespace()
      True
      
    • 단일 이름이 여러 객체에 바인딩될 수 있다는 점에 유의하세요. 결과가 True이면 이름은 새 네임스페이스를 도입하지 않는 intlist와 같은 다른 객체에도 바인딩될 수 있습니다.
  • get_namespaces() — 이 이름에 바인딩된 네임스페이스 목록을 반환합니다.
  • get_namespace() — 이 이름에 바인딩된 네임스페이스를 반환합니다. 이 이름에 둘 이상의 네임스페이스가 바인딩되거나 아무것도 바인딩되지 않으면 ValueError가 발생합니다.

명령줄 사용법

versionadded: 3.13.

symtable 모듈은 명령줄에서 스크립트로 실행할 수 있습니다.

python -m symtable [infile...]

지정된 Python 소스 파일에 대해 심볼 테이블이 생성되어 stdout으로 덤프됩니다. 입력 파일이 지정되지 않으면 콘텐츠는 stdin에서 읽습니다.

더 알아보기 (Learn more)