2012-12-13 21 views
7

Chcę zbudować debugger wizualny, który pomoże uczniom programistom zobaczyć, jak przebiega ocena ekspresji (w jaki sposób wyliczenia podwyrażeń są oceniane i "zastępowane" przez ich wartości, podobnie jak wizualizer oceny wyrażeń w Excelu).Jak przejść przez proces oceny wyrażeń Pythona?

Wygląda na to, że nie można przejść przez ten proces z WPB Pythona, a jej najlepszym krokiem ziarnistość jest linia kodu. Czy można w jakiś sposób przejść przez bajt Pythona? Jakieś inne pomysły, jak osiągnąć ten cel?

EDIT: Muszę lekkie rozwiązanie, które może być zbudowany na szczycie CPython biblioteki standardowej.

+0

nie byłoby to coś takiego, jak debugger poziomu poziomu [gdb] (http: //wiki.python.org/moin/DebuggingWithGdb)? –

+0

@ X.Jacobs - Potrzebuję rozwiązania, które można zbudować na domyślnej dystrybucji CPython i powinno działać zarówno w systemie Windows, jak i OS X i Linux. – Aivar

+0

[Debugowanie C/C++ i CPython przy użyciu nowej wersji rozszerzenia Pythona GDB 7] (http://misspent.wordpress.com/2012/03/24/debugging-cc-and-cpython-using-gdb-7s-new -python-extension-support /) –

Odpowiedz

1

Mam pomysł rozwiązanie również siebie - mogłem instrumentem kod (lub AST) owijając wszystkie (sub) wyrażeń w krótkim obojętne wywołanie metody, które nie wymaga niczego więcej niż zwrócenie argumentu. Na przykład.

x = f(sin(x + y)) 

staje

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

ten sposób mam pewność być zgłoszone po każdym podwyrażenie zostanie oceniony i ja również uzyskać wartości. Mogę również dodać dodatkowy Lokalizacja/AST informacje o którą część wypowiedzi jest obecnie zająć, np:

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

Niestety wymaga to brudząc z AST i kompilacja ...

+0

Cześć! Wygląda na to, że rozwiązuję ten sam problem jak ty :) Czy możesz rzucić okiem na [moje pytanie] (http://stackoverflow.com/questions/40639652/tracing-python-expression-evaluation-step-by- krok). Jest otwarta nagroda. Wygląda na to, że szukam części kodu, którą tutaj opisałeś. Mogę spróbować zagłębić się w kod twojego oprogramowania Thonny (ponieważ chciałbym mieć coś współdziałającego z Jowerem i nie chcę pełnego debuggera, obecnie nie chcę używać Thonny'ego), ale wierzę, że będziesz Zrób to lepiej :) –

+0

@ IlyaV.Schurov, odpowiedni kod jest tutaj https://bitbucket.org/plas/thonny/src/master/thonny/backend.py?at=master&fileviewer=file-view-default, może ty może ponownie użyć czegoś. Prawdopodobnie potrzebujesz również https://bitbucket.org/plas/thonny/src/master/thonny/ast_utils.py?at=master&fileviewer=file-view-default, ponieważ Python AST nie zawiera wystarczających (poprawnych) informacji o tym, gdzie Węzeł AST znajduje się w kodzie. – Aivar

+0

Dzięki! Czy mógłbyś skopiować swoją odpowiedź na [moje pytanie] (http://stackoverflow.com/questions/40639652/tracing-python-expression-evaluation-step-by- step), aby umożliwić mi rozważenie tego jako możliwego zwycięzcy nagrody? –

1

Za pomocą pdb można wywołać dowolne wywołanie funkcji. W przypadku każdej innej instrukcji pdb może wydrukować wartości odpowiednich nazw w linii. Jakiej dodatkowej funkcji nie potrzebujesz?

Jeśli starasz się „krokiem w” rzeczy jak lista zrozumienia, że ​​nie będą pracować z czystego perspektywy Pythona, ponieważ jest to jeden opcode. W pewnym momencie dla każdego wyrażenia będziesz musiał powiedzieć uczniom "i to jest, gdzie Python przechodzi do implementacji C i ocenia to ...".

+0

Problem dotyczy sytuacji, gdy na linii jest kilka wywołań funkcji. Jeśli wybiorę polecenie "krok" w tej linii, znajdę się w jednej z tych funkcji i nie jest jasne, która. Gdyby Python wszedł do wszystkich funkcji, mógłbym parsować wyrażenie z wyprzedzeniem, aby dowiedzieć się, w jakiej kolejności wywoływane są wywołania funkcji. Pomogłoby mi to śledzić, co podwyrażenie musi być obecnie oceniane. Niestety, Python nie wkracza w funkcje wbudowane/C i syntaktycznie te wywołania funkcji są nieodróżnialne od wywołań funkcji zdefiniowanych przez użytkownika. – Aivar

+0

Wykonuje wszystkie funkcje tak długo, jak długo naciskasz "s". A twoja skarga, że ​​"Python nie wkracza w funkcje wbudowane/C" jest dokładnie moim punktem: w pewnym momencie schodzisz do C i potrzebujesz sposobu, aby sobie z tym poradzić. To może być gdb lub coś zupełnie innego, ale to się zawsze wydarzy. – jknupp

+0

Nie chcę wchodzić w funkcje C, chcę tylko wiedzieć, gdzie jestem pod względem oryginalnego wyrażenia, ale Python mi tego nie mówi (zobacz moje inne pytanie: http://stackoverflow.com/questions/ 13952022 /). Mógłbym policzyć liczbę wpisów funkcji i śledzić pozycję osobiście, ale fakt, że niektóre (nieznana liczba) wywołań funkcji będą ignorowane przez znacznik, przerywa mój system liczenia. – Aivar

1

Powinieneś sprawdzić reinteract, to całkiem proste i można przyczynić się do tego

2

próbowałeś pudb? http://pypi.python.org/pypi/pudb Na debian-like: apt-get install python-pudb

Przywiązuje do WPB, więc myślę, że to nie jest to, czego szukasz. Przynajmniej, gdy wejdziesz w funkcję, to wyraźnie widać, który z nich jesteś w

do nauczania studentów, coś, co można mieć.

  • najpierw napisać program za pomocą zmiennych, komponując za pomocą kilku kroków, debugowanie tego programu przy użyciu dowolnego przyzwoitego debugera Pythona (pdb, winpdb, pudb ...),
  • następnie, gdy proces zostanie dobrze zrozumiany, pozbyć się zmiennych tymczasowych, łącząc kod w mniejszą liczbę stopniowo, aż dojdziesz do końcowego kodu.

Wiem, daleko jest do perfekcji, ale w tej chwili jest to najlepsze, o czym mogę pomyśleć.

Powiązane problemy