質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

401閲覧

vscodeでpythonコードをデバッグでのループ時にステップアウトした時の挙動を変えたい

kee_situmon

総合スコア3

デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2023/11/14 18:48

編集2023/11/14 20:10

ジェネレーター内でステップアウトした際にループが実行されないようにしたいです

12行目からステップインすると
イメージ説明
8行目からステップインすると

イメージ説明
3行目からステップアウトするとtest()内のループが実行されて
コンソールに
0
1
2
3
4
と表示され
イメージ説明
こうなります

4行目でステップインした場合はで9行目で止まってくれます

9行目にブレークポイントを置けば止まってくれるのですがそうしてなかった場合に勝手にループを実行されないようにしたいです

何か方法がありますでしょうか?

試したこと

検索してみたり、拡張機能を探してみたりしましたが解決できませんでした

補足情報(FW/ツールのバージョンなど)

pythonバージョン:Python 3.11.3
launch.jsonの構成
{
"name": "Python: 現在のファイル",
"type": "python",
"request": "launch",
"program": "${file}",
"console": "integratedTerminal",
"justMyCode": false
}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

VSCodeは使ったことはありませんが、問題はそこではないと思います。

9行目にブレークポイントを置けば止まってくれるのですがそうしてなかった場合に勝手にループを実行されないようにしたいです

「勝手に」というと、「プログラムの動作とは別にデバッガが違う動作をして」ループを実行している、と解釈されていると思いますが、それは間違いです。
デバッガは、基本的にプログラムの通りに動かなければなりませんし、もし違う動作をするのであればデバッガの不具合です。
まぁデバッガも人が作ったものですから、バグがないとは言いませんが、今回の場合は完全に「プログラムがそのように動いているから、デバッガもその通りに動いている」のです。

試しに、fortestの中を以下のようにしてみて、実行してみてください。

python

1def fortest(): 2 for i in range(0, 5): 3 print('a:', i) 4 yield i

実行結果は、以下のようになるはずです。

a: 0 0 a: 1 1 a: 2 2 a: 3 3 a: 4 4

この結果を見ても、fortestの中のyield文とtestの中のfor文の中の処理が交互に実行されているのが解ると思います。

なぜこのような動きになるか、ですが、以下のfor文

python

1for i in fortest(): 2 print(i)

この部分を、for文を使わずに書き直してみると、以下のようになります。

python

1it = iter(fortest()) 2while True: 3 try: 4 i = next(it) 5 except StopIteration: 6 break 7 print(i)

一番勘違いしやすい点は、fortest()です。
通常の関数であれば。これで関数の中の処理が実行されますが、関数ではなくジェネレータの場合には中の処理は実行されず、単にジェネレータオブジェクトと呼ばれるものを返すだけになります。

次に、next関数が呼ばれると、ようやくジェネレータの中の処理が始まり、yield文まで実行され、yield文で指定した値がnext関数の戻り値として返されます。
そして、次にnext関数が実行されると、ジェネレータの中の以前のyield文で中断された箇所から、また次のyield文まで実行されます。
最後に、ジェネレータの中の処理が終わると、StopIteration例外が投げられます。

このように、for文がジェネレータの中の処理とfor文の中の処理を並列に処理しているわけなので、デバッガが勝手にfor文の中の処理を実行しているわけではないのです。


長々と書きましたが、ここまで理解した上で「挙動を変えたい」というのであれば、それもありでしょう。
あくまでバグを取るのが目的であり、そのための手段であれば何も問題ありません。
ただ、冒頭で言ったとおり自分はVSCodeは使っていないので、その辺りの助言はできませんが、ただあまりなさそうだな、と思いますし、一時的に下記のように書き直したほうが早いかもしれません。

python

1for i in list(fortest()): 2 print(i)

投稿2023/11/16 13:40

編集2023/11/16 23:37
katsuko

総合スコア3582

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問