ví dụ/nâng cao/tên_of_caller_function. py
import inspect def first[]: print["in first"] print["Called by", inspect.stack[][1][3]] second[] def second[]: print["in second"] print["Called by", inspect.stack[][1][3]] def main[]: first[] main[]Cách tốt nhất để gọi hàm Python trong chương trình là sử dụng trình gỡ lỗi. Thay vào đó, nếu bạn muốn lấy thông tin này theo chương trình, bạn có thể phân tích dấu vết ngăn xếp cuộc gọi bằng gói
0python3 -m pdb whocalled.py
Tôi sẽ chỉ cho bạn cả hai phương pháp và cũng trình bày giải pháp thay thế thứ ba - sử dụng trình hiển thị thực thi
Nhận người gọi bằng trình gỡ lỗi
Ưu điểm của việc sử dụng trình gỡ lỗi là bạn không phải sửa đổi mã chương trình thực tế
Nó không thể được sử dụng trong chương trình của bạn - vì điều đó bạn cần sử dụng
0, vì vậy nếu bạn muốn đưa ra quyết định trong mã của mình dựa trên người gọi, thì vui lòng bỏ qua phần tiếp theopython3 -m pdb whocalled.py
Trình gỡ lỗi là gì?
Trình gỡ lỗi là một công cụ phần mềm, được sử dụng để kiểm tra các chương trình, nó chủ yếu được sử dụng để điều tra lỗi hoặc các vấn đề về hiệu suất. Trình gỡ lỗi cho phép bạn tạm dừng, khởi động lại hoặc thậm chí thực hiện từng bước chương trình của mình. Bạn cũng có thể kiểm tra hoặc sửa đổi các biến trong chương trình của mình một cách tương tác khi chương trình đang chạy
Làm quen với trình gỡ lỗi cần một chút luyện tập, nhưng đó là một kỹ năng rất có giá trị, mọi nhà phát triển phần mềm có tham vọng nên dành thời gian để làm quen với việc sử dụng một trình gỡ lỗi.
PDB là gì?
Nếu bạn đã cài đặt Python trên máy của mình, thì bạn đã có trình gỡ lỗi, vì Python theo mặc định đi kèm với mô-đun
2 - Trình gỡ lỗi Pythonpython3 -m pdb whocalled.py
Tôi sẽ chỉ cho bạn cách bạn có thể sử dụng
2 với sự trợ giúp của một ví dụ đơn giản. Tôi sẽ sử dụng tập lệnh nhỏ này để trình diễnpython3 -m pdb whocalled.py
def called_function[]: print["I am called"] def caller_function[]: print["I am the caller"] called_function[] caller_function[]
Mục tiêu của chúng ta là dừng chương trình đang chạy khi
4 được thực thi và tìm xem nó được gọi từ đâupython3 -m pdb whocalled.py
Bắt đầu PDB
Đầu tiên, chúng ta cần bắt đầu kịch bản với
2python3 -m pdb whocalled.py
python3 -m pdb whocalled.py
Điều này sẽ tải tập lệnh, nhưng tạm dừng thực thi tập lệnh trước dòng đầu tiên. Pdb sẽ in dòng mà chúng tôi đang đứng và sau đó cung cấp cho chúng tôi lời nhắc
6 tương tácpython3 -m pdb whocalled.py
> /pythonin1minute/whocalled.py[1][] -> def called_function[]: [Pdb]
Đặt điểm dừng - Yêu cầu PDB tạm dừng tại một điểm nhất định
Để làm cho
2 tạm dừng tạipython3 -m pdb whocalled.py
4, chúng ta sẽ cần đặt cái gọi là điểm dừng. Khi quá trình thực thi đạt đến điểm dừng, trình gỡ lỗi sẽ tạm dừng chương trình và đưa chúng tôi trở lại dấu nhắc tương tác, vì vậy chúng tôi sẽ có thể kiểm tra trạng thái của chương trìnhpython3 -m pdb whocalled.py
Điểm dừng có thể được tạo bằng lệnh
9. Là đối số đầu tiên của nó, chúng ta có thể chỉ định tên tệp và số dòng hoặc tên hàm. Chúng tôi sẽ sử dụng tên chức năngpython3 -m pdb whocalled.py
4python3 -m pdb whocalled.py
[Pdb] break called_function
Tiếp tục - Tiếp tục thực hiện cho đến khi chúng tôi đạt đến điểm dừng
Chúng ta có thể để tập lệnh chạy bằng lệnh
1. Nó sẽ dừng ở breakpoint tiếp theo hoặc khi chương trình kết thúc thực thi> /pythonin1minute/whocalled.py[1][] -> def called_function[]: [Pdb]
[Pdb] continue
Tạo PDB In dấu vết ngăn xếp cuộc gọi
2 sẽ dừng tại điểm dừng mà chúng tôi đã đặt tại> /pythonin1minute/whocalled.py[1][] -> def called_function[]: [Pdb]
4python3 -m pdb whocalled.py
I am the caller > /pythonin1minute/whocalled.py[2]called_function[] -> print["I am called"]
Bây giờ, chúng ta có thể sử dụng lệnh
4 để in dấu vết ngăn xếp cuộc gọi> /pythonin1minute/whocalled.py[1][] -> def called_function[]: [Pdb]
[pdb] ở đâu
/home/linuxbrew/.linuxbrew/Cellar/python/3.7.6_1/lib/python3.7/bdb.py[585]run[] -> exec[cmd, globals, locals] [1][] /pythonin1minute/whocalled.py[8][] -> caller_function[] /pythonin1minute/whocalled.py[6]caller_function[] -> called_function[] > /pythonin1minute/whocalled.py[2]called_function[] -> print["I am called"]
Như bạn có thể thấy dấu vết ngăn xếp về cơ bản là danh sách chuỗi lệnh gọi, với lệnh gọi mới nhất ở dưới cùng. Bạn có thể đọc ngược - từ dưới lên
5 đang được gọi bởi> /pythonin1minute/whocalled.py[1][] -> def called_function[]: [Pdb]
4python3 -m pdb whocalled.py
4 đang được gọi bởipython3 -m pdb whocalled.py
8> /pythonin1minute/whocalled.py[1][] -> def called_function[]: [Pdb]
8 đang được gọi bởi> /pythonin1minute/whocalled.py[1][] -> def called_function[]: [Pdb]
0[Pdb] break called_function
Toàn bộ phiên
python3 -m pdb whocalled.py
2 này để kiểm tra chuỗi lệnh gọi hàm trông giống như thế nàyGiao diện trực quan cho trình gỡ lỗi
Bản thân
> /pythonin1minute/whocalled.py[1][]
-> def called_function[]:
[Pdb]
2 đã rất mạnh, nhưng giao diện dòng lệnh không phải là giao diện trực quan hoặc linh hoạt nhất. May mắn thay, hầu hết các IDE hiện đại - như PyCharm hoặc Visual Studio Code - đều cung cấp giao diện trực quan thân thiện hơn để gỡ lỗiTrình hiển thị mã
Một cách hay khác để kiểm tra việc thực thi mã của bạn là sử dụng trình hiển thị mã. Đó chính xác là cơ chế giống như sử dụng trình sửa lỗi, nhưng bạn sẽ có được một hình ảnh trực quan đẹp mắt về cách chương trình của bạn được thực thi
Nếu bạn đang cố gắng hiểu một đoạn mã nhỏ hơn, bạn có thể sử dụng trình hiển thị trực tuyến tại. Thật tuyệt vời cho mục đích giáo dục
Chạy qua ví dụ trước, tôi có một biểu đồ thực thi nhỏ xinh
Nhận người gọi bằng cách sử dụng python3 -m pdb whocalled.py
0
python3 -m pdb whocalled.py
Mô-đun
python3 -m pdb whocalled.py
0 cung cấp cho nhà phát triển các công cụ để kiểm tra trạng thái chương trình hiện tại, bạn có thể nhận được nhiều thông tin thời gian chạy hữu ích về các đối tượng và biến của mìnhNếu bạn muốn đưa ra quyết định dựa trên người gọi hàm thì đây là cách để thực hiện
Ghi chú. hầu hết thời gian đây không phải là một ý tưởng hay và - trừ khi bạn thực sự biết mình đang làm gì - có lẽ bạn nên sửa lại kiến trúc chương trình của mình. Có một vài trường hợp đặc biệt, nhưng nói chung, các chức năng chỉ nên giao tiếp với người gọi của chúng thông qua các phương tiện thông thường. g. đối số của họ và trả lại giá trị
Lấy ngăn xếp trong thời gian chạy
Mô-đun
python3 -m pdb whocalled.py
0 định nghĩa một hàm tiện ích có tên là [Pdb] break called_function
6 mà chúng ta có thể sử dụng để truy xuất ngăn xếp cuộc gọiGọi
[Pdb] break called_function
7 trả về một danh sách, trong đó phần tử đầu tiên là lệnh gọi cuối cùng [hàm mà chúng ta gọi [Pdb] break called_function
7 từ đó], phần tử thứ hai là hàm đã gọi chúng ta, v.v.Mỗi phần tử trả về một
[Pdb] break called_function
9, có thuộc tính [Pdb] continue
0, trả về tên hàm. Nó có nghĩa là chúng ta có thể nhận được người gọi như thế này