Hướng dẫn is there a call stack in python? - có ngăn xếp cuộc gọi trong python không?

Trong Python, làm thế nào tôi có thể in ngăn xếp cuộc gọi hiện tại từ trong một phương thức (cho mục đích gỡ lỗi).

Hướng dẫn is there a call stack in python? - có ngăn xếp cuộc gọi trong python không?

Martineau

Huy hiệu vàng 116K2525 gold badges161 silver badges288 bronze badges

Đã hỏi ngày 20 tháng 7 năm 2009 lúc 21:24Jul 20, 2009 at 21:24

Dưới đây là một ví dụ về việc lấy ngăn xếp thông qua mô -đun Traceback và in nó:

import traceback

def f():
    g()

def g():
    for line in traceback.format_stack():
        print(line.strip())

f()

# Prints:
# File "so-stack.py", line 10, in 
#     f()
# File "so-stack.py", line 4, in f
#     g()
# File "so-stack.py", line 7, in g
#     for line in traceback.format_stack():

Nếu bạn thực sự chỉ muốn in ngăn xếp vào Stderr, bạn có thể sử dụng:

traceback.print_stack()

Hoặc để in ra stdout (hữu ích nếu muốn giữ đầu ra được chuyển hướng cùng nhau), sử dụng:

traceback.print_stack(file=sys.stdout)

Nhưng nhận được nó thông qua

traceback.print_stack()
2 cho phép bạn làm bất cứ điều gì bạn thích với nó.

Đã trả lời ngày 20 tháng 7 năm 2009 lúc 21:27Jul 20, 2009 at 21:27

RichiehindlerichiehindleRichieHindle

264K46 Huy hiệu vàng354 Huy hiệu bạc395 Huy hiệu Đồng46 gold badges354 silver badges395 bronze badges

6

import traceback
traceback.print_stack()

Đã trả lời ngày 20 tháng 7 năm 2009 lúc 21:28Jul 20, 2009 at 21:28

Mark Roddymark RoddyMark Roddy

26.3K19 Huy hiệu vàng66 Huy hiệu bạc71 Huy hiệu đồng19 gold badges66 silver badges71 bronze badges

3

Đối với những người cần in ngăn xếp cuộc gọi trong khi sử dụng PDB, chỉ cần làm

(Pdb) where

Đã trả lời ngày 24 tháng 1 năm 2020 lúc 10:41Jan 24, 2020 at 10:41

mouseratmouseratmouserat

1.30712 huy hiệu bạc9 Huy hiệu đồng12 silver badges9 bronze badges

traceback.print_stack()
3 Trả về ngăn xếp hiện tại thay vì truy tìm ngoại lệ:

import inspect
print inspect.stack()

Xem https://gist.github.com/fredloney/5454553 để biết chức năng tiện ích log_stack.

Đã trả lời ngày 24 tháng 4 năm 2013 lúc 19:37Apr 24, 2013 at 19:37

Fred Loneyfred LoneyFred Loney

7515 Huy hiệu bạc4 Huy hiệu đồng5 silver badges4 bronze badges

1

Nếu bạn sử dụng trình gỡ lỗi Python, không chỉ thăm dò tương tác các biến mà bạn có thể nhận được ngăn xếp cuộc gọi với lệnh "WHERE" hoặc "W".

Vì vậy, ở đầu chương trình của bạn

import pdb

Sau đó trong mã mà bạn muốn xem những gì đang xảy ra

pdb.set_trace()

và bạn bị rơi vào một lời nhắc

Đã trả lời ngày 23 tháng 10 năm 2016 lúc 20:47Oct 23, 2016 at 20:47

Hướng dẫn is there a call stack in python? - có ngăn xếp cuộc gọi trong python không?

KeirkeirKeir

5171 Huy hiệu vàng6 Huy hiệu bạc16 Huy hiệu đồng1 gold badge6 silver badges16 bronze badges

5

Đây là một biến thể của câu trả lời tuyệt vời của @Richiehindle, trong đó thực hiện một người trang trí có thể được áp dụng có chọn lọc cho các chức năng như mong muốn. Hoạt động với Python 2.7,14 và 3.6.4.

from __future__ import print_function
import functools
import traceback
import sys

INDENT = 4*' '

def stacktrace(func):
    @functools.wraps(func)
    def wrapped(*args, **kwds):
        # Get all but last line returned by traceback.format_stack()
        # which is the line below.
        callstack = '\n'.join([INDENT+line.strip() for line in traceback.format_stack()][:-1])
        print('{}() called:'.format(func.__name__))
        print(callstack)
        return func(*args, **kwds)

    return wrapped

@stacktrace
def test_func():
    return 42

print(test_func())

Đầu ra từ mẫu:

test_func() called:
    File "stacktrace_decorator.py", line 28, in 
    print(test_func())
42

Đã trả lời ngày 6 tháng 2 năm 2018 lúc 22:42Feb 6, 2018 at 22:42

Hướng dẫn is there a call stack in python? - có ngăn xếp cuộc gọi trong python không?

Martineaumartineaumartineau

Huy hiệu vàng 116K2525 gold badges161 silver badges288 bronze badges

1

Cài đặt kiểm tra-itInspect-it

traceback.print_stack()
0

Mã số

traceback.print_stack()
1

Bạn có thể tạo đoạn trích của dòng này

Nó sẽ hiển thị cho bạn một danh sách các ngăn xếp gọi chức năng với tên tệp và số dòngfunction call stack with a filename and line number

Danh sách từ đầu đến nơi bạn đặt dòng này

Đã trả lời ngày 5 tháng 7 năm 2019 lúc 5:49Jul 5, 2019 at 5:49

Hướng dẫn is there a call stack in python? - có ngăn xếp cuộc gọi trong python không?

MohitghodasaramohitghodasaraMohitGhodasara

2.0321 Huy hiệu vàng22 Huy hiệu bạc28 Huy hiệu đồng1 gold badge22 silver badges28 bronze badges

Điều gì là xếp chồng trong Python?

Trong hướng dẫn này, bạn sẽ tìm hiểu về cấu trúc dữ liệu ngăn xếp và việc triển khai nó trong Python, Java và C/C ++. Một ngăn xếp là một cấu trúc dữ liệu tuyến tính tuân theo nguyên tắc cuối cùng trong First Out (LIFO). Điều này có nghĩa là phần tử cuối cùng được chèn vào bên trong ngăn xếp được loại bỏ trước.

Call Stack nằm ở đâu?

Vùng ngăn xếp chứa ngăn xếp chương trình (chức năng gọi), cấu trúc LIFO, thường nằm trong phần cao hơn của bộ nhớ. Một thanh ghi "con trỏ ngăn xếp" theo dõi đỉnh của ngăn xếp; Nó được điều chỉnh mỗi lần một giá trị được "đẩy" lên ngăn xếp.typically located in the higher parts of memory. A "stack pointer" register tracks the top of the stack; it is adjusted each time a value is "pushed" onto the stack.

Python có đệ quy đuôi không?

Một số ngôn ngữ lập trình được thu hồi, về cơ bản điều này có nghĩa là chúng có thể thực hiện tối ưu hóa cho các chức năng trả về kết quả của việc tự gọi mình.Đó là, chức năng chỉ trả về một cuộc gọi cho chính nó., essentially this means is that they're able to make optimizations to functions that return the result of calling themselves. That is, the function returns only a call to itself.

Phương thức Call Stack Stack là gì?

Ngăn xếp gọi phương thức (đôi khi được gọi là ngăn xếp thực hiện chương trình) là một cấu trúc dữ liệu hoạt động ở phía sau hậu trường để hỗ trợ cơ chế gọi/trả lại phương thức.Nó cũng hỗ trợ việc tạo, bảo trì và phá hủy từng biến cục bộ được gọi là phương thức.a data structure that works behind the scenes to support the method call/return mechanism. It also supports the creation, maintenance and destruction of each called method's local variables.