Cách sử dụng bảng ký hiệu cục bộ trong python?

Hôm nay, chúng ta sẽ xem xét cách sử dụng hàm locals() trong Python. Đây là một chức năng tiện ích khác khá hữu ích để gỡ lỗi chương trình của bạn

Hàm locals() cung cấp cho chúng ta bảng ký hiệu cục bộ hiện tại, như một từ điển

Bây giờ, nếu bạn không chắc bảng ký hiệu cục bộ chính xác là gì, hãy tiếp tục đọc. Hãy đi từng bước một, bắt đầu với định nghĩa của Bảng ký hiệu


Bảng ký hiệu là gì?

Chà, Bảng ký hiệu là một bảng bao gồm thông tin liên quan đến các ký hiệu khác nhau. Ở đây, một biểu tượng có thể có nghĩa là bất kỳ thứ gì - tên biến, từ khóa, tên hàm, v.v.

Chúng đại diện cho tất cả tên của tất cả các biến, lớp và hàm trong chương trình của bạn

Nói chung, Bảng ký hiệu không chỉ bao gồm tên của các đối tượng này mà còn có các thông tin hữu ích khác, như loại đối tượng, phạm vi, v.v.

Bây giờ bạn đã biết ý nghĩa của Bảng ký hiệu, hãy đến với các lớp của Bảng ký hiệu

Có 2 loại Bảng ký hiệu, cho chương trình Python

  • Global Symbol Table -> lưu trữ thông tin liên quan đến phạm vi toàn cục của chương trình
  • Bảng ký hiệu cục bộ -> lưu trữ thông tin liên quan đến phạm vi cục bộ (hiện tại) của chương trình

Đây là hai bảng ký hiệu, được xác định dựa trên phạm vi toàn cầu và phạm vi cục bộ (hiện tại)

Khi chúng tôi đề cập đến Bảng ký hiệu cục bộ, chúng tôi đề cập đến tất cả thông tin trong phạm vi hiện tại của chúng tôi, khi trình thông dịch thực thi từng dòng mã của chúng tôi

Chính xác thì hàm local() của Python làm gì?

Bây giờ, chức năng của hàm locals() chỉ đơn giản là dán thông tin Bảng ký hiệu cục bộ trên bảng điều khiển, trên phạm vi nơi mà locals() được gọi từ

Vì vậy, điều này tự nhiên có nghĩa là đầu ra của Python locals() sẽ là một từ điển chứa tất cả các tên biến và thuộc tính, phạm vi, v.v.

Ví dụ: nếu bạn có một tệp tên là

{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x12ba85542>, '__spec__': None, '__annotations__': {}, '__builtins__': , '__file__': '/Users/askpython/home/locals_example.py', '__cached__': None}
0. Hãy đặt locals() làm câu lệnh duy nhất của chúng ta và xem điều gì sẽ xảy ra. Chúng ta sẽ lấy tất cả các thông tin liên quan trong phạm vi
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x12ba85542>, '__spec__': None, '__annotations__': {}, '__builtins__': , '__file__': '/Users/askpython/home/locals_example.py', '__cached__': None}
2 (trong trường hợp này, nó giống với Phạm vi toàn cầu)

# main.py
print(locals())

Đầu ra có thể

{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x12ba85542>, '__spec__': None, '__annotations__': {}, '__builtins__': , '__file__': '/Users/askpython/home/locals_example.py', '__cached__': None}

Chà, chúng ta có thể thấy một số thuộc tính của mô-đun

{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x12ba85542>, '__spec__': None, '__annotations__': {}, '__builtins__': , '__file__': '/Users/askpython/home/locals_example.py', '__cached__': None}
2 (Phạm vi toàn cầu), bao gồm cả một số chi tiết gói

Như một số bạn có thể ngay lập tức nhận ra, điều này giống với

{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x12ba85542>, '__spec__': None, '__annotations__': {}, '__builtins__': , '__file__': '/Users/askpython/home/locals_example.py', '__cached__': None}
4 ở đây, vì cả hai đều đề cập đến cùng một phạm vi toàn cầu


Gọi cho người dân địa phương() từ một phạm vi địa phương

Bây giờ, hãy xem xét việc gọi locals() bên trong phạm vi cục bộ, từ một hàm

Gọi cho người dân địa phương() bên trong một chức năng

Hãy xem xét một hàm đơn giản

{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x12ba85542>, '__spec__': None, '__annotations__': {}, '__builtins__': , '__file__': '/Users/askpython/home/locals_example.py', '__cached__': None}
6, nhận hai đối số
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x12ba85542>, '__spec__': None, '__annotations__': {}, '__builtins__': , '__file__': '/Users/askpython/home/locals_example.py', '__cached__': None}
7 và
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x12ba85542>, '__spec__': None, '__annotations__': {}, '__builtins__': , '__file__': '/Users/askpython/home/locals_example.py', '__cached__': None}
8 và trả về tổng. Chúng ta sẽ gọi locals() ngay trước khi hàm trả về

# Global variable
global_var = 1234

def fun(a, b):
    global global_var
    temp = 100
    print(f"locals() inside fun(a, b) = {locals()}")
    return a + b

if __name__ == '__main__':
    print(f"locals() outside fun(a, b) = {locals()}")
    print(fun(10, 20))

đầu ra

locals() outside fun(a, b) = {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x7f7023e1ff60>, '__spec__': None, '__annotations__': {}, '__builtins__': , '__file__': 'locals_example.py', '__cached__': None, 'global_var': 1234, 'fun': }
locals() inside fun(a, b) = {'a': 10, 'b': 20, 'temp': 100}
30

Ở đây, có một sự thay đổi đáng chú ý từ bên trong

{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x12ba85542>, '__spec__': None, '__annotations__': {}, '__builtins__': , '__file__': '/Users/askpython/home/locals_example.py', '__cached__': None}
6. Ở đây, bảng ký hiệu cục bộ chỉ bao gồm các tên liên quan đến chức năng này

Vì phạm vi cục bộ không phải là một phần của gói nên không có thông tin về gói và phần này chỉ chứa các biến liên quan đến hàm, cộng với các đối số

Cũng lưu ý rằng biến toàn cục

# Global variable
global_var = 1234

def fun(a, b):
    global global_var
    temp = 100
    print(f"locals() inside fun(a, b) = {locals()}")
    return a + b

if __name__ == '__main__':
    print(f"locals() outside fun(a, b) = {locals()}")
    print(fun(10, 20))
1 là một phần của bảng ký hiệu toàn cục và do đó không có trong bảng ký hiệu cục bộ

Gọi người dân địa phương () bên trong Lớp

Điều này tương tự như gọi từ một hàm, nhưng điều này sẽ chứa tất cả các phương thức của lớp và các thuộc tính có liên quan

Hãy nhanh chóng xem xét, sử dụng một ví dụ

class Student():
    def __init__(self, name):
        self.name = name
    def get_name(self):
        return self.name
    print(f"Calling locals() from inside a class => {locals()}")
    print(f"Calling globals() from inside a class => {globals()}")

if __name__ == '__main__':
    s = Student('Amit')
    print(s.get_name())

Ở đây, chúng ta sẽ gọi locals() bên trong Lớp sau khi chúng ta định nghĩa tất cả các phương thức của lớp. Vì vậy, các phương thức lớp này cũng phải là một phần của bảng ký hiệu cục bộ

đầu ra

Calling locals() from inside a class => {'__module__': '__main__', '__qualname__': 'Student', '__init__': , 'get_name': }

Calling globals() from inside a class => {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x7fe2673cff28>, '__spec__': None, '__annotations__': {}, '__builtins__': , '__file__': 'locals_class.py', '__cached__': None}
Amit

Thật vậy, như bạn có thể thấy, locals() đưa ra các phương pháp liên quan

Khi chúng ta gọi locals() từ bên trong thân lớp, chúng ta sẽ nhận được tên mô-đun, tên lớp và các biến lớp

Bảng ký hiệu toàn cầu không có bất kỳ thứ gì thuộc loại này, như mong đợi


Phần kết luận

Trong bài viết này, chúng ta đã học cách lấy thông tin từ phạm vi cục bộ, sử dụng hàm locals(). Điều này trả về một từ điển gồm tất cả các tên và thuộc tính hữu ích từ bảng ký hiệu cục bộ và rất hữu ích để gỡ lỗi

Bảng ký hiệu địa phương là gì?

Bảng ký hiệu cục bộ. Bảng ký hiệu cục bộ chứa các mô tả về biến, loại và cấu trúc chương trình mà trình gỡ lỗi sử dụng để định vị và giải thích các giá trị thời gian chạy . Bảng cung cấp loại ký hiệu, lớp lưu trữ và độ lệch trong các bảng khác để xác định thêm ký hiệu.

Không gian tên trong bảng ký hiệu Python là gì?

Thuật ngữ không gian tên được sử dụng thay cho bảng ký hiệu trong tài liệu Python của lớp SymbolTable , một phiên bản cho phép truy cập vào bảng ký hiệu của một khối mã được tạo bởi . Do đó, không gian tên và bảng ký hiệu, trong Python, liên quan đến cùng một thứ.

Bảng biểu tượng Hàm toán Python là gì?

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

Bảng ký hiệu và không gian tên là gì?

Bảng ký hiệu, trong Perl, là một hàm băm chứa tất cả các tên được xác định trong một không gian tên . Tất cả các tên biến và hàm có thể được tìm thấy ở đó. Băm cho mỗi không gian tên được đặt tên theo không gian tên với hai dấu hai chấm. Ví dụ: bảng ký hiệu cho không gian tên Foo được gọi là %Foo.