12

Python でのデバッグに関する投稿が無数にあることは知っていますが、探しているものが見つかりません....ビジュアル デバッガーです。例えば:

one@localhost ~ $ cat duh.py    
import pdb
class Coordinate(object):
     pdb.set_trace()
     def __init__(self, x, y):
         self.x = x
         self.y = y
     def __repr__(self):
         return "Coord: " + str(self.__dict__)
def add(a, b):
     return Coordinate(a.x + b.x, a.y + b.y)
def sub(a, b):
    return Coordinate(a.x - b.x, a.y - b.y)

one = Coordinate(100,200)
two = Coordinate(300,200)

add(one, two)

実際に使用されている値を確認したい。見る代わりに見def __init__(self, x, y):たいdef __init__(self, 100, 200):

> /home/one/duh.py(14)<module>()
-> one = Coordinate(100,200)
(Pdb) s
--Call--
> /home/one/duh.py(4)__init__()
-> def __init__(self, x, y):
(Pdb) s
> /home/one/duh.py(5)__init__()
-> self.x = x
(Pdb) s
> /home/one/duh.py(6)__init__()
-> self.y = y
(Pdb) s
--Return--
> /home/one/duh.py(6)__init__()->None
-> self.y = y

私はインタープリターの内部で何が起こっているのかを盲目的に知ることにまったく慣れていないので、他のスクリプト言語デバッガー (JavaScript のステップスルーなど) のように内部で何が起こっているのかを実際に確認したいと思っています。

4

4 に答える 4

11

その pdb のデバッグは面白くないようです。嫌いな理由がわかります。

幸いなことに、ビジュアル Python デバッガーがいくつかあります。私が最も頻繁に使用する 2 つは商用製品ですが、どちらもコストに見合うだけの価値があります。それらはKomodo IDEIntelliJ IDEAです。これらは、Python に加えて他の多くの言語をサポートする多言語 IDE です。PyCharmと呼ばれる Python 専用バージョンの IDEA もあります。

Winpdbという優れた無料オプションもあります。使い方は簡単です。インストールして開いたら、[ファイル]/[起動] を使用して.pyファイルへのフル パスを入力すると、デバッグを開始できます。

これらの製品はすべてマルチプラットフォームですが、Windows を使用している場合は、Microsoft のPython Tools for Visual Studioも無料で利用できます。これは、商用の Visual Studio 2015 または Visual Studio 2015 の無料の Community Edition にインストールできます。

参考までに、Winpdb、Komodo、および IDEA からのコードのスクリーンショットを次に示します。__init__私はそれぞれの機能に足を踏み入れました:

ここに画像の説明を入力  

ここに画像の説明を入力  

ここに画像の説明を入力

私が使用したコード フォントが気に入らなくても心配しないでください。それは私の個人的な設定です。もちろん、通常の使用では、画面はそれほど窮屈ではありません。スクリーンショットに収まるように小さくしました。

これらのビジュアル デバッガーのいずれかを強くお勧めします。1 回のキーストロークでコードをステップ実行し、変数の変化を確認できるのは素晴らしいことです。

于 2013-05-10T03:27:05.100 に答える
3

initが呼び出された後ではなく、クラスが定義されているときに、現在の pdb.set_trace() 呼び出しが発生しています。pdb.set_trace() 呼び出しをinit内に移動した場合

import pdb
class Coordinate(object):
     def __init__(self, x, y):
          pdb.set_trace()

          self.x = x
          self.y = y
     def __repr__(self):
          return "Coord: " + str(self.__dict__)
def add(a, b):
     return Coordinate(a.x + b.x, a.y + b.y)
def sub(a, b):
     return Coordinate(a.x - b.x, a.y - b.y)

one = Coordinate(100,200)
two = Coordinate(300,200)

add(one, two)

次に、pdbprint x, yで値を入力して取得できます:

C:\Users\randlet>python duh.py
> c:\users\randlet\duh.py(6)__init__()
-> self.x = x
(Pdb) print x, y
100 200
(Pdb) c
> c:\users\randlet\duh.py(6)__init__()
-> self.x = x
(Pdb) print x, y
300 200
(Pdb) n
> c:\users\randlet\duh.py(7)__init__()
-> self.y = y
(Pdb) n
--Return--
> c:\users\randlet\duh.py(7)__init__()->None
-> self.y = y
(Pdb) n
> c:\users\randlet\duh.py(18)<module>()
-> add(one, two)
(Pdb) print one, two
Coord: {'y': 200, 'x': 100} Coord: {'y': 200, 'x': 300}
(Pdb) s
--Call--
> c:\users\randlet\duh.py(10)add()
-> def add(a, b):
(Pdb) print a, b
Coord: {'y': 200, 'x': 100} Coord: {'y': 200, 'x': 300}
(Pdb)
于 2013-05-10T00:43:16.127 に答える