Python kiểm tra ngăn xếp 1 3


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

python3 -m pdb whocalled.py
0

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

python3 -m pdb whocalled.py
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 theo

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

python3 -m pdb whocalled.py
2 - Trình gỡ lỗi Python

Tôi sẽ chỉ cho bạn cách bạn có thể sử dụng

python3 -m pdb whocalled.py
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ễn

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

python3 -m pdb whocalled.py
4 được thực thi và tìm xem nó được gọi từ đâu

Bắt đầu PDB

Đầu tiên, chúng ta cần bắt đầu kịch bản với

python3 -m pdb whocalled.py
2

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

python3 -m pdb whocalled.py
6 tương tác

> /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

python3 -m pdb whocalled.py
2 tạm dừng tại
python3 -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ình

Điểm dừng có thể được tạo bằng lệnh

python3 -m pdb whocalled.py
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ăng
python3 -m pdb whocalled.py
4

[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

> /pythonin1minute/whocalled.py[1][]
-> def called_function[]:
[Pdb]
1. Nó sẽ dừng ở breakpoint tiếp theo hoặc khi chương trình kết thúc thực thi

[Pdb] continue

Tạo PDB In dấu vết ngăn xếp cuộc gọi

> /pythonin1minute/whocalled.py[1][]
-> def called_function[]:
[Pdb]
2 sẽ dừng tại điểm dừng mà chúng tôi đã đặt tại
python3 -m pdb whocalled.py
4

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

> /pythonin1minute/whocalled.py[1][]
-> def called_function[]:
[Pdb]
4 để in dấu vết ngăn xếp cuộc gọi

[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

  • > /pythonin1minute/whocalled.py[1][]
    -> def called_function[]:
    [Pdb]
    5 đang được gọi bởi
    python3 -m pdb whocalled.py
    4
  • python3 -m pdb whocalled.py
    4 đang được gọi bởi
    > /pythonin1minute/whocalled.py[1][]
    -> def called_function[]:
    [Pdb]
    8
  • > /pythonin1minute/whocalled.py[1][]
    -> def called_function[]:
    [Pdb]
    8 đang được gọi bởi
    [Pdb] break called_function
    0

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ày

Giao 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ỗi

Trì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

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ình

Nế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ọi

Gọ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

Kiểm tra ngăn xếp trong Python là gì?

kiểm tra. stack[] trả về danh sách có bản ghi khung . Trong hàm whoami[]. quan sát. stack[][1] là bản ghi khung của hàm gọi whoami , như foo[] và bar[].

Làm cách nào để lấy mã nguồn Python?

getsource[] được sử dụng để lấy mã nguồn của các đối tượng Python. .
cú pháp. quan sát. lấy nguồn [đối tượng]
Tham số. Tham số loại đối tượng mà chúng tôi muốn mã nguồn
loại trả lại. văn bản của mã nguồn cho một đối tượng

Chữ ký trong Python là gì?

Chữ ký hàm [hoặc chữ ký kiểu hoặc chữ ký phương thức] xác định đầu vào và đầu ra của hàm hoặc phương thức . Một chữ ký có thể bao gồm. tham số và các loại của họ. một giá trị trả về và loại. ngoại lệ có thể bị ném hoặc trả lại.

Chủ Đề