Python

symtable — 컴파일러 심볼 테이블 액세스

소스 코드: Lib/symtable.py


심볼 테이블은 바이트 코드가 생성되기 직전에 컴파일러가 AST에서 생성합니다. 심볼 테이블은 코드 내 모든 식별자의 스코프를 계산하는 역할을 합니다. symtable 은 이러한 테이블을 조사할 수 있는 인터페이스를 제공합니다.

심볼 테이블 생성하기

symtable.symtable(code, filename, compile_type, *, module=None)

파이썬 소스 code 에 대한 최상위 SymbolTable 을 반환합니다. filename 은 코드가 포함된 파일의 이름이며, compile_typecompile()mode 인자와 유사합니다. 선택적 인자인 module 은 모듈 이름을 지정하며, 이는 모듈 이름에 따라 구문 경고를 명확하게 filter 하는 데 필요합니다.

Added in version 3.15: module 파라미터가 추가되었습니다.

심볼 테이블 검사하기

class symtable.SymbolTableType

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

MODULE = "module"

모듈의 심볼 테이블에 사용됩니다.

FUNCTION = "function"

함수의 심볼 테이블에 사용됩니다.

CLASS = "class"

클래스의 심볼 테이블에 사용됩니다.

다음 멤버들은 다양한 형태의 annotation scopes 를 참조합니다.

ANNOTATION = "annotation"

from __future__ import annotations 이 활성화된 경우 어노테이션에 사용됩니다.

TYPE_ALIAS = "type alias"

type 구조의 심볼 테이블에 사용됩니다.

TYPE_PARAMETERS = "type parameters"

generic functions 또는 generic classes 의 심볼 테이블에 사용됩니다.

TYPE_VARIABLE = "type variable"

형식적인 의미에서의 단일 타입 변수(즉, TypeVar, TypeVarTuple 또는 ParamSpec 객체)의 바인딩, 제약 튜플 또는 기본값에 대한 심볼 테이블에 사용됩니다. (후자의 두 객체는 바인딩이나 제약 튬을 지원하지 않습니다.)

Added in version 3.13.

class symtable.SymbolTable

블록에 대한 이름 공간 테이블. 생성자는 공개되지 않습니다.

get_type()

심볼 테이블의 형을 돌려줍니다. 가능한 값은 SymbolTableType 열거형의 멤버들입니다.

버전 3.12에서 변경: 가능한 반환 값으로 'annotation', 'TypeVar bound', 'type alias''type parameter' 를 추가했습니다.

버전 3.13에서 변경: 반환 값은 SymbolTableType 열거형의 멤버입니다.

반환되는 문자열의 정확한 값은 향후 변경될 수 있으므로, 하드코딩된 문자열 대신 SymbolTableType 멤버를 사용하는 것을 권장합니다.

get_id()

테이블의 식별자를 돌려줍니다.

get_name()

테이블의 이름을 반환합니다. 테이블이 클래스를 위한 경우 클래스 이름, 함수를 위한 경우 함수 이름, 전역인 경우(또한 get_type()'module' 을 반환함) 'top' 을 반환합니다. 타입 파라미터 스코프(제네릭 클래스, 함수 및 타입 별칭에 사용됨)의 경우 기본이 되는 클래스, 함수 또는 타입 별칭의 이름을 반환합니다. 타입 별칭 스코프의 경우 타입 별칭의 이름을 반환하며, TypeVar 바인딩 스코프의 경우 TypeVar 의 이름을 반환합니다.

get_lineno()

이 테이블이 나타내는 블록의 첫 번째 줄 번호를 반환합니다.

is_optimized()

이 테이블의 지역(locals)을 최적화할 수 있으면 True를 반환합니다.

is_nested()

블록이 중첩된 클래스나 함수면 True를 반환합니다.

has_children()

블록에 중첩된 이름 공간이 있으면 True를 반환합니다. 이것들은 get_children()으로 얻을 수 있습니다.

get_identifiers()

테이블에 포함된 심볼의 이름을 포함하는 뷰 객체를 반환합니다. documentation of view objects 를 참조하십시오.

lookup(name)

테이블에서 name을 찾아서 Symbol 인스턴스를 반환합니다.

get_symbols()

테이블에 있는 이름에 대한 Symbol 인스턴스 리스트를 반환합니다.

get_children()

중첩된 심볼 테이블의 리스트를 반환합니다.

class symtable.Function

함수나 메서드의 이름 공간. 이 클래스는 SymbolTable을 상속합니다.

get_parameters()

이 함수의 매개 변수 이름을 포함하는 튜플을 반환합니다.

get_locals()

이 함수의 지역 이름을 포함하는 튜플을 반환합니다.

get_globals()

이 함수의 전역 이름을 포함하는 튜플을 반환합니다.

get_nonlocals()

이 함수에서 명시적으로 선언된 nonlocal 이름을 포함하는 튜플을 반환합니다.

get_frees()

이 함수의 자유 (클로저) 변수 이름을 포함하는 튜플을 반환합니다.

get_cells()

이 테이블에 있는 cell variables 의 이름을 포함하는 튜플을 반환합니다.

Added in version 3.15.

class symtable.Class

클래스의 이름 공간. 이 클래스는 SymbolTable을 상속합니다.

class symtable.Symbol

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

get_name()

심볼의 이름을 돌려줍니다.

is_referenced()

심볼이 블록에서 사용되면 True를 반환합니다.

is_imported()

심볼이 import 문에서 만들어지면 True를 반환합니다.

is_parameter()

심볼이 매개 변수면 True를 반환합니다.

is_type_parameter()

심볼이 타입 파라미터인 경우 True 를 반환합니다.

Added in version 3.14.

is_global()

심볼이 전역이면 True를 반환합니다.

is_nonlocal()

심볼이 nonlocal이면 True를 반환합니다.

is_declared_global()

심볼이 global 문으로 전역으로 선언되면 True를 반환합니다.

is_local()

심볼이 블록의 지역이면 True를 반환합니다.

is_annotated()

심볼이 어노테이트 되었으면 True를 반환합니다.

Added in version 3.6.

is_free()

심볼이 블록에서 참조되지만 대입되지 않으면 True를 반환합니다.

is_cell()

심볼이 중첩된 블록에서 참조되지만 할당되지 않은 경우 True 를 반환합니다.

Added in version 3.15.

is_free_class()

클래스 범위의 심볼이 메서드 관점에서 자유로운(free) 경우 True 를 반환합니다.

다음 예제를 고려하십시오:

def f():
    x = 1  # 함수 범위
    class C:
        x = 2  # 클래스 범위
        def method(self):
            return x

이 예제에서 클래스 범위의 심볼 xC.method 관점에서 자유로운 것으로 간주되므로, 해당 메서드가 실행 시점에 2 가 아닌 1 을 반환할 수 있습니다.

Added in version 3.14.

is_assigned()

심볼이 블록에 대입되면 True를 반환합니다.

is_comp_iter()

심볼이 컴프리헨션 반복 변수인 경우 True 를 반환합니다.

Added in version 3.14.

is_comp_cell()

심볼이 인라인된 컴프리헨션의 셀인 경우 True 를 반환합니다.

Added in version 3.14.

is_namespace()

이름 연결(name binding)이 새로운 이름 공간을 도입하면 True를 반환합니다.

이름이 함수나 클래스 문의 대상으로 사용되면 참입니다.

예를 들면:

>>> table = symtable.symtable("def some_func(): pass", "string", "exec")
>>> table.lookup("some_func").is_namespace()
True

하나의 이름을 여러 객체에 연결할 수 있음에 유의하십시오. 결과가 True 이면, 이름은 새 이름 공간을 도입하지 않는 int 나 list와 같은 다른 객체에도 연결되어있을 수 있습니다.

get_namespaces()

이 이름에 연결된 이름 공간의 리스트를 돌려줍니다.

get_namespace()

이 이름에 연결된 이름 공간을 돌려줍니다. 이 이름에 연결된 이름 공간이 둘 이상이거나 없으면, ValueError가 발생합니다.

명령줄 사용법

Added in version 3.13.

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

python -m symtable [infile...]

지정된 파이썬 소스 파일에 대해 심볼 테이블을 생성하고 표준 출력(stdout)으로 출력합니다. 입력 파일이 지정되지 않은 경우 내용을 표준 입력(stdin)에서 읽어옵니다.