2012-12-13 39 views
7

Tôi muốn xây dựng trình gỡ lỗi trực quan, giúp sinh viên lập trình xem cách đánh giá biểu thức (cách biểu thức con được đánh giá và "thay thế" bằng giá trị của chúng, chẳng hạn như trình hiển thị đánh giá biểu thức trong Excel).Làm cách nào để thực hiện quá trình đánh giá biểu thức Python?

Có vẻ như bạn không thể thực hiện quá trình này với pdb của Python, vì mức độ chi tiết của bước tốt nhất là dòng mã. Có bằng cách nào đó có thể bước qua bytecode của Python không? Bất kỳ ý tưởng nào khác về cách đạt được mục tiêu này?

EDIT: Tôi cần một giải pháp gọn nhẹ có thể được xây dựng trên thư viện chuẩn CPython.

+0

sẽ không giống như trình gỡ rối cấp độ pythons c [gdb] (http: //wiki.python.org/moin/DebuggingWithGdb)? –

+0

@ X.Jacobs - Tôi cần một giải pháp có thể được xây dựng dựa trên phân phối mặc định của CPython và nó sẽ hoạt động trong Windows cũng như trong OSX và Linux. – Aivar

+0

[Gỡ lỗi C/C++ và CPython bằng cách sử dụng hỗ trợ mở rộng Python mới của GDB 7] [http://misspent.wordpress.com/2012/03/24/debugging-cc-and-cpython-using-gdb-7s-new -python-extension-support /) –

Trả lời

1

Tôi có một ý tưởng giải pháp cũng bản thân mình - tôi có thể công cụ mã (hay AST) bằng cách gói tất cả (sub) biểu thức trong một gọi phương thức giả, không có gì hơn là trả về đối số của nó. Ví dụ.

x = f(sin(x + y)) 

trở thành

x = dummy(f(dummy(sin(dummy(dummy(x) + dummy(y)))))) 

Bằng cách này tôi đảm bảo để được thông báo sau mỗi subexpression được đánh giá và tôi cũng có được các giá trị. Tôi cũng có thể bổ sung thêm địa điểm/AST thông tin về những phần của biểu thức hiện đang xử lý, ví dụ:

... dummy(x, line=23, col=13, length=1) ... 

Đáng tiếc là điều này đòi hỏi rối tung với AST và biên soạn ...

+0

Xin chào! Có vẻ như tôi đang giải quyết cùng một vấn đề với bạn :) Bạn có thể vui lòng xem [câu hỏi của tôi] (http://stackoverflow.com/questions/40639652/tracing-python-expression-evaluation-step-by- bậc thang). Có một tiền thưởng mở. Có vẻ như tôi đang tìm một phần mã mà bạn mô tả ở đây. Tôi có thể thử tìm hiểu mã của phần mềm Thonny của bạn (vì tôi muốn có thứ gì đó tương tác với Jupyter và tôi không muốn trình gỡ lỗi đầy đủ, hiện tại tôi không muốn sử dụng Thonny), nhưng tôi tin rằng bạn sẽ làm tốt hơn :) –

+0

@ IlyaV.Schurov, mã có liên quan ở đây https://bitbucket.org/plas/thonny/src/master/thonny/backend.py?at=master&fileviewer=file-view-default, có thể bạn có thể sử dụng lại thứ gì đó từ đó. Bạn cũng có thể cần https://bitbucket.org/plas/thonny/src/master/thonny/ast_utils.py?at=master&fileviewer=file-view-default vì Python AST không bao gồm thông tin đủ (chính xác) về nơi mỗi Nút AST nằm trong mã. – Aivar

+0

Cảm ơn! Bạn có thể vui lòng sao chép câu trả lời của bạn cho [câu hỏi của tôi] (http://stackoverflow.com/questions/40639652/tracing-python-expression-evaluation-step-by-step) để cho phép tôi xem đó là một người chiến thắng có thể có tiền thưởng không? –

1

Sử dụng pdb, mọi cuộc gọi chức năng đều có thể được thực hiện. Đối với bất kỳ câu lệnh nào khác, pdb có thể in các giá trị của các tên có liên quan trong dòng. Bạn đang tìm kiếm những chức năng bổ sung nào không được đề cập?

Nếu bạn đang cố gắng 'bước vào' những thứ như một danh sách hiểu, điều đó sẽ không hoạt động từ góc độ Python thuần túy bởi vì đó là một mã duy nhất. Tại một số điểm cho mỗi biểu thức, bạn sẽ cần phải nói cho sinh viên của bạn 'và đây là nơi Python đi vào việc thực hiện C và đánh giá này ...'.

+0

Vấn đề là khi có một số cuộc gọi chức năng trên một dòng. Nếu tôi chọn lệnh "step" ở dòng này thì tôi sẽ tìm thấy chính mình ở một trong những chức năng đó và không rõ cái nào. Nếu Python bước vào tất cả các chức năng thì tôi có thể phân tích cú pháp biểu thức trước để tìm hiểu thứ tự các cuộc gọi hàm được đánh giá theo thứ tự nào. Điều này sẽ giúp tôi theo dõi những gì biểu hiện phụ phải được đánh giá vào lúc này. Nhưng tiếc là Python không bước vào các hàm dựng sẵn/C và cú pháp các cuộc gọi hàm này không thể phân biệt được với các cuộc gọi đến các hàm do người dùng định nghĩa. – Aivar

+0

Nó bước vào tất cả các chức năng miễn là bạn tiếp tục nhấn 's'. Và khiếu nại của bạn rằng 'Python không bước vào các hàm dựng sẵn/C' chính xác là quan điểm của tôi: tại một thời điểm nào đó, bạn rơi vào C và cần một cách để giải quyết vấn đề đó. Đó có thể là gdb hoặc cái gì khác hoàn toàn, nhưng nó sẽ _always_ xảy ra. – jknupp

+0

Tôi không muốn bước vào các hàm C, tôi chỉ muốn biết tôi đang ở đâu về mặt biểu thức ban đầu, nhưng Python không cho tôi biết điều này (xem câu hỏi khác của tôi: http://stackoverflow.com/questions/ 13952022 /). Tôi có thể đếm số lượng các mục chức năng và theo dõi vị trí của bản thân mình, nhưng thực tế là một số (số không rõ) của các cuộc gọi chức năng sẽ bị bỏ qua bởi dấu vết, phá vỡ hệ thống đếm của tôi. – Aivar

1

Bạn nên kiểm tra reinteract, nó khá đơn giản và bạn có thể đóng góp cho rằng

2

Các bạn đã thử pudb? http://pypi.python.org/pypi/pudb Trên một debian-như: apt-get install python-pudb

Nó gắn vào pdb, vì vậy tôi đoán đây không phải là những gì bạn đang tìm kiếm. Ít nhất, khi bạn bước vào một chức năng, rõ ràng xuất hiện mà một trong những bạn đang ở

Đối với sinh viên giảng dạy, một cái gì đó mà bạn có thể có thể là:.

  • đầu tiên, hãy viết chương trình sử dụng các biến, sáng tác sử dụng một số bước,
  • debug chương trình này sử dụng bất cứ debugger python phong nha (pdb, winpdb, pudb ...),
  • sau đó, một khi quá trình này được hiểu rõ, thoát khỏi các biến tạm thời, bằng cách kết hợp mã vào ít dòng, dần dần, cho đến khi bạn đến với mã cuối cùng.

Tôi biết, nó rất xa vời, nhưng đây là điều tốt nhất tôi có thể nghĩ đến, vào lúc này.

Các vấn đề liên quan