symtable --- Truy cập vào bảng ký hiệu của trình biên dịch

Source code: Lib/symtable.py


Các bảng ký hiệu được trình biên dịch tạo ra từ AST ngay trước khi tạo mã byte. Bảng ký hiệu chịu trách nhiệm tính toán phạm vi của mọi mã định danh trong mã. symtable cung cấp giao diện để kiểm tra các bảng này.

Tạo bảng ký hiệu

symtable.symtable(code, filename, compile_type)

Trả về SymbolTable cấp cao nhất cho nguồn Python code. filename là tên file chứa code. compile_type giống như đối số mode với compile().

Kiểm tra bảng ký hiệu

class symtable.SymbolTableType

Một bảng liệt kê cho biết loại đối tượng SymbolTable.

MODULE = "module"

Được sử dụng cho bảng ký hiệu của mô-đun.

FUNCTION = "function"

Được sử dụng cho bảng ký hiệu của hàm.

CLASS = "class"

Được sử dụng cho bảng ký hiệu của một lớp.

Các thành viên sau đây đề cập đến các hương vị khác nhau của annotation scopes.

ANNOTATION = "annotation"

Được sử dụng cho chú thích nếu from __future__ import annotations đang hoạt động.

TYPE_ALIAS = "type alias"

Dùng cho bảng ký hiệu của các công trình type.

TYPE_PARAMETERS = "type parameters"

Dùng cho bảng ký hiệu của generic functions hoặc generic classes.

TYPE_VARIABLE = "type variable"

Được sử dụng cho bảng ký hiệu của giới hạn, bộ ràng buộc hoặc giá trị mặc định của một biến kiểu đơn theo nghĩa chính thức, tức là một đối tượng TypeVar, TypeVarTuple hoặc một đối tượng ParamSpec (hai đối tượng sau không hỗ trợ một bộ dữ liệu ràng buộc hoặc ràng buộc).

Added in version 3.13.

class symtable.SymbolTable

Một bảng không gian tên cho một khối. Hàm tạo không được công khai.

get_type()

Trả về kiểu của bảng ký hiệu. Các giá trị có thể có là thành viên của bảng liệt kê SymbolTableType.

Thay đổi trong phiên bản 3.12: Đã thêm 'annotation', 'TypeVar bound', 'type alias''type parameter' làm giá trị trả về có thể.

Thay đổi trong phiên bản 3.13: Giá trị trả về là thành viên của bảng liệt kê SymbolTableType.

Các giá trị chính xác của chuỗi trả về có thể thay đổi trong tương lai và do đó, nên sử dụng các thành viên SymbolTableType thay vì các chuỗi được mã hóa cứng.

get_id()

Trả về mã định danh của bảng.

get_name()

Trả về tên của bảng. Đây là tên của lớp nếu bảng dành cho một lớp, tên hàm nếu bảng dành cho một hàm hoặc 'top' nếu bảng là toàn cục (get_type() trả về 'module'). Đối với phạm vi tham số kiểu (được sử dụng cho các lớp, hàm và bí danh kiểu chung), đó là tên của bí danh lớp, hàm hoặc kiểu cơ bản. Đối với phạm vi bí danh loại, đó là tên của bí danh loại. Đối với phạm vi giới hạn TypeVar, đó là tên của TypeVar.

get_lineno()

Trả về số dòng đầu tiên trong khối mà bảng này đại diện.

is_optimized()

Trả về True nếu các nội dung cục bộ trong bảng này có thể được tối ưu hóa.

is_nested()

Trả về True nếu khối là lớp hoặc hàm lồng nhau.

has_children()

Trả về True nếu khối có các không gian tên lồng nhau bên trong nó. Những thứ này có thể thu được bằng get_children().

get_identifiers()

Trả về một đối tượng khung nhìn chứa tên của các ký hiệu trong bảng. Xem documentation of view objects.

lookup(name)

Tra cứu name trong bảng và trả về một phiên bản Symbol.

get_symbols()

Trả về danh sách các phiên bản Symbol cho các tên trong bảng.

get_children()

Trả về danh sách các bảng ký hiệu lồng nhau.

class symtable.Function

Một không gian tên cho một hàm hoặc phương thức. Lớp này kế thừa từ SymbolTable.

get_parameters()

Trả về một bộ chứa tên các tham số cho hàm này.

get_locals()

Trả về một bộ chứa tên của người dân địa phương trong hàm này.

get_globals()

Trả về một bộ chứa tên của các biến toàn cục trong hàm này.

get_nonlocals()

Trả về một bộ chứa tên của các đối tượng không cục bộ được khai báo rõ ràng trong hàm này.

get_frees()

Trả về một bộ chứa tên của free (closure) variables trong hàm này.

class symtable.Class

Một không gian tên của một lớp. Lớp này kế thừa từ SymbolTable.

get_methods()

Trả về một bộ chứa tên của các hàm giống phương thức được khai báo trong lớp.

Ở đây, thuật ngữ 'phương thức' chỉ định hàm any được xác định trong nội dung lớp thông qua def hoặc async def.

Các hàm được xác định ở phạm vi sâu hơn (ví dụ: trong lớp bên trong) không được get_methods() chọn.

Ví dụ:

>>> nhập biểu tượng
>>> st = symtable.symtable('''
... def bên ngoài(): vượt qua
...
... lớp A:
... chắc chắn f():
... def w(): vượt qua
...
... def g(self): vượt qua
...
... @classmethod
... async def h(cls): vượt qua
...
... toàn cầu bên ngoài
... def bên ngoài (tự): vượt qua
... ''', 'kiểm tra', 'thực thi')
>>> class_A = st.get_children()[2]
>>> class_A.get_methods()
('f', 'g', 'h')

Mặc dù A().f() tăng TypeError khi chạy, A.f vẫn được coi là một hàm giống phương thức.

Không được dùng nữa kể từ phiên bản 3.14, sẽ bị xóa trong phiên bản 3.16.

class symtable.Symbol

Một mục trong SymbolTable tương ứng với một mã định danh trong nguồn. Hàm tạo không được công khai.

get_name()

Trả lại tên của biểu tượng.

is_referenced()

Trả về True nếu ký hiệu được sử dụng trong khối của nó.

is_imported()

Trả về True nếu biểu tượng được tạo từ câu lệnh nhập.

is_parameter()

Trả về True nếu ký hiệu là một tham số.

is_type_parameter()

Trả về True nếu ký hiệu là tham số loại.

Added in version 3.14.

is_global()

Trả về True nếu biểu tượng là toàn cục.

is_nonlocal()

Trả về True nếu ký hiệu không cục bộ.

is_declared_global()

Trả về True nếu biểu tượng được khai báo toàn cục bằng câu lệnh toàn cục.

is_local()

Trả về True nếu ký hiệu cục bộ trong khối của nó.

is_annotated()

Trả về True nếu biểu tượng được chú thích.

Added in version 3.6.

is_free()

Trả về True nếu ký hiệu được tham chiếu trong khối của nó nhưng chưa được gán cho.

is_free_class()

Trả về True nếu ký hiệu trong phạm vi lớp không có trong phối cảnh của phương thức.

Hãy xem xét ví dụ sau:

chắc chắn f():
    x = 1# function-scoped
    lớp C:
        x = 2 # class-scoped
        phương thức def (tự):
            trả lại x

Trong ví dụ này, ký hiệu x trong phạm vi lớp được coi là không nằm trong quan điểm của C.method, do đó cho phép ký hiệu sau trả về 1 khi chạy chứ không phải 2.

Added in version 3.14.

is_assigned()

Trả về True nếu ký hiệu được gán trong khối của nó.

is_comp_iter()

Trả về True nếu ký hiệu là biến lặp hiểu.

Added in version 3.14.

is_comp_cell()

Trả về True nếu ký hiệu là một ô trong cách hiểu nội tuyến.

Added in version 3.14.

is_namespace()

Trả về True nếu liên kết tên giới thiệu không gian tên mới.

Nếu tên được sử dụng làm mục tiêu của một câu lệnh hàm hoặc lớp thì điều này sẽ đúng.

Ví dụ:

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

Lưu ý rằng một tên có thể được liên kết với nhiều đối tượng. Nếu kết quả là True, tên đó cũng có thể được liên kết với các đối tượng khác, như int hoặc list, mà không đưa ra một không gian tên mới.

get_namespaces()

Trả về danh sách các không gian tên được liên kết với tên này.

get_namespace()

Trả lại không gian tên được liên kết với tên này. Nếu có nhiều hơn một hoặc không có không gian tên nào được liên kết với tên này, thì ValueError sẽ được nâng lên.

Sử dụng dòng lệnh

Added in version 3.13.

Mô-đun symtable có thể được thực thi dưới dạng tập lệnh từ dòng lệnh.

python -m  thể biểu tượng [infile...]

Các bảng biểu tượng được tạo cho các tệp nguồn Python đã chỉ định và được chuyển sang thiết bị xuất chuẩn. Nếu không có tệp đầu vào nào được chỉ định, nội dung sẽ được đọc từ stdin.