symtable — 컴파일러의 심볼 테이블 접근
symtable — 컴파일러의 심볼 테이블 접근
심볼 테이블은 bytecode가 생성되기 직전에 컴파일러에 의해 AST에서 생성됩니다. 심볼 테이블은 코드의 모든 식별자의 범위(scope)를 계산하는 책임이 있습니다. symtable은 이러한 테이블을 검사하기 위한 인터페이스를 제공합니다.
본문
심볼 테이블 생성
symtable.symtable(code, filename, compile_type)
Python 소스 코드에 대한 최상위 SymbolTable을 반환합니다. filename은 코드를 포함하는 파일의 이름입니다. compile_type은 compile()의 mode 인자와 같습니다.
심볼 테이블 검사
symtable.SymbolTableType
SymbolTable 객체의 유형을 나타내는 열거형입니다.
- MODULE — 모듈의 심볼 테이블에 사용됩니다.
- FUNCTION — 함수의 심볼 테이블에 사용됩니다.
- CLASS — 클래스의 심볼 테이블에 사용됩니다.
다음 멤버들은 다양한 종류의 주석(annotation) 범위를 가리킵니다.
- ANNOTATION —
from __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 - 이 예제에서 클래스 범위 심볼
x는C.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이면 이름은 새 네임스페이스를 도입하지 않는int나list와 같은 다른 객체에도 바인딩될 수 있습니다.
- get_namespaces() — 이 이름에 바인딩된 네임스페이스 목록을 반환합니다.
- get_namespace() — 이 이름에 바인딩된 네임스페이스를 반환합니다. 이 이름에 둘 이상의 네임스페이스가 바인딩되거나 아무것도 바인딩되지 않으면
ValueError가 발생합니다.
명령줄 사용법
versionadded: 3.13.
symtable 모듈은 명령줄에서 스크립트로 실행할 수 있습니다.
python -m symtable [infile...]
지정된 Python 소스 파일에 대해 심볼 테이블이 생성되어 stdout으로 덤프됩니다. 입력 파일이 지정되지 않으면 콘텐츠는 stdin에서 읽습니다.