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__': , '__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__': , '__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__': , '__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__': , '__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__': , '__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__': , '__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__': , '__spec__': None, '__annotations__': {}, '__builtins__': , '__file__': '/Users/askpython/home/locals_example.py', '__cached__': None}7 và
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': , '__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__': , '__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__': , '__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__': , '__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