for i in ...:
for j in ...:
for k in ...:
if something:
# continue loop i
一般的なケースでは、複数レベルのループがあり、 break
機能しない場合(現在のループのすぐ上のループではなく、上のループの1つを継続したいため)、次のいずれかを実行できます。
エスケープしたいループを関数にリファクタリングする
def inner():
for j in ...:
for k in ...:
if something:
return
for i in ...:
inner()
欠点は、以前はスコープ内にあったいくつかの変数をその新しい関数に渡す必要がある場合があることです。それらをパラメーターとして渡すか、オブジェクトのインスタンス変数にするか(意味がある場合は、この関数のために新しいオブジェクトを作成する)、またはグローバル変数、シングルトンなど(ehm、ehm)のいずれかを使用できます。
またはinner
、ネストされた関数として定義して、必要なものだけをキャプチャすることもできます(遅いかもしれませんか?)
for i in ...:
def inner():
for j in ...:
for k in ...:
if something:
return
inner()
例外を使用する
哲学的には、これは例外であり、必要に応じて、構造化プログラミングビルディングブロック(if、for、while)を通るプログラムフローを中断します。
利点は、単一のコードを複数の部分に分割する必要がないことです。これは、Pythonで記述しているときに設計しているある種の計算である場合に適しています。この初期段階で抽象化を導入すると、速度が低下する可能性があります。
このアプローチの悪い点は、インタプリタ/コンパイラの作成者は通常、例外は例外的であると想定し、それに応じて例外を最適化することです。
class ContinueI(Exception):
pass
continue_i = ContinueI()
for i in ...:
try:
for j in ...:
for k in ...:
if something:
raise continue_i
except ContinueI:
continue
このための特別な例外クラスを作成して、他の例外を誤って消してしまうリスクを回避します。
完全に別の何か
私はまだ他の解決策があると確信しています。