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ề
SymbolTablecấ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ớicompile().
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_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'và'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
SymbolTableTypethay 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ạnTypeVar, đó là tên củaTypeVar.
- 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ề
Truenế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ề
Truenếu khối là lớp hoặc hàm lồng nhau.
- has_children()¶
Trả về
Truenế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ằngget_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.
- 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
defhoặcasync 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ăngTypeErrorkhi chạy,A.fvẫ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
SymbolTabletươ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ề
Truenếu ký hiệu được sử dụng trong khối của nó.
- is_imported()¶
Trả về
Truenếu biểu tượng được tạo từ câu lệnh nhập.
- is_parameter()¶
Trả về
Truenếu ký hiệu là một tham số.
- is_type_parameter()¶
Trả về
Truenếu ký hiệu là tham số loại.Added in version 3.14.
- is_global()¶
Trả về
Truenếu biểu tượng là toàn cục.
- is_nonlocal()¶
Trả về
Truenếu ký hiệu không cục bộ.
- is_declared_global()¶
Trả về
Truenế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ề
Truenếu ký hiệu cục bộ trong khối của nó.
- is_annotated()¶
Trả về
Truenếu biểu tượng được chú thích.Added in version 3.6.
- is_free()¶
Trả về
Truenế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
xtrong phạm vi lớp được coi là không nằm trong quan điểm củaC.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ề
Truenếu ký hiệu được gán trong khối của nó.
- is_comp_iter()¶
Trả về
Truenếu ký hiệu là biến lặp hiểu.Added in version 3.14.
- is_comp_cell()¶
Trả về
Truenế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ề
Truenế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ì
ValueErrorsẽ đượ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 có 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.