else: pass
残りのコード(最後のprint 'processing...
ステートメント)を実行するために、以下に示すものが必要な理由を誰かが説明できますか?実行が実際にそのパスを取っていることがわかるように、がそこに配置さprint
れていることに注意してください。else
continue
のコードは何もしないので、が実行されないときはいつでもそうなるはずelse
です。ただし、省略した場合、条件がFalseの場合(拡張子がディレクトリにファイルが存在する場合else
)、ループ内でそれ以上何も実行されていないように見えます。これは私には意味がありません。ドキュメントには、「最も近い囲みループの次のサイクルを続行する」と記載されていますが、実行されない場合、処理は次のステートメントに進むべきではありませんか?for
continue
import os
source_dir = r'C:\Downloads'
ext = '.mp3'
for dirName, subdirList, fileList in os.walk(source_dir):
if not any(os.path.splitext(fileName)[1].lower() == ext for fileName in fileList):
print ' skipping "{}"'.format(dirName)
continue
else: # why is this clause needed to continue this iteration of a loop?
print 'contains "{}"'.format(dirName)
pass
print 'processing "{}" which has "{}" files'.format(dirName, ext)
謎解き
一見奇妙な振る舞いは、上記のコードにも通常は私のテキストエディタにも表示されないインデントの問題が原因でした。最後のprint
ステートメントは3つのスペースでインデントされ、次にタブでインデントされていることがわかりました。これにより、と一致しているように見えますelse
が、実際には、そこにある場合はpass
inの後に続くか、の最初の部分のに続きます。明らかに私を大いに混乱させます。else
continue
if
これは、「スペース/タブを表示」オプションがオンになっているテキストエディタのコードのスクリーンショットです。赤い点はスペースを表し、赤い右のギユメ(»
)はタブ文字を表します。