5

else: pass残りのコード(最後のprint 'processing...ステートメント)を実行するために、以下に示すものが必要な理由を誰かが説明できますか?実行が実際にそのパスを取っていることがわかるように、がそこに配置さprintれていることに注意してください。else

continueのコードは何もしないので、が実行されないときはいつでもそうなるはずelseです。ただし、省略した場合、条件がFalseの場合(拡張子ディレクトリにファイルが存在する場合else)、ループ内でそれ以上何も実行されていないように見えます。これは私には意味がありません。ドキュメントには、「最も近い囲みループの次のサイクルを続行する」と記載されていますが、実行されない場合、処理は次のステートメントに進むべきではありませんか?forcontinue

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が、実際には、そこにある場合はpassinの後に続くか、の最初の部分のに続きます。明らかに私を大いに混乱させます。elsecontinueif

これは、「スペース/タブを表示」オプションがオンになっているテキストエディタのコードのスクリーンショットです。赤い点はスペースを表し、赤い右のギユメ(»)はタブ文字を表します。

悪いインデントを示す私のエディターのファイルのスクリーンショット

4

2 に答える 2

6

あなたはそれを必要としません。次の2つのスクリプトを実行しました。

#test1.py
import os

source_dir = '.'
ext = '.txt'

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)

#test2.py
import os

source_dir = '.'
ext = '.txt'

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)

私はそれらを次のように実行しました:

python test1.py > junk.log
python test2.py > junk.log2

これが最初の数行ですjunk.log

test $ head junk.log
processing "." which has ".txt" files
  skipping "./new"
  skipping "./unum"
processing "./unum/kiv-unum-409befe069ac" which has ".txt" files
  skipping "./unum/kiv-unum-409befe069ac/build"
  skipping "./unum/kiv-unum-409befe069ac/build/bdist.macosx-10.3-fat"
  skipping "./unum/kiv-unum-409befe069ac/build/lib"
  skipping "./unum/kiv-unum-409befe069ac/build/lib/tests"
  skipping "./unum/kiv-unum-409befe069ac/build/lib/unum"
  skipping "./unum/kiv-unum-409befe069ac/build/lib/unum/units

「処理」行の存在に注意してください。

それから私diffは出力します:

diff junk.log junk.log2

次の結果が得られます。

0a1
> contains   "."
3a5
> contains   "./unum/kiv-unum-409befe069ac"
14a17
> contains   "./unum/kiv-unum-409befe069ac/docs"
16a20
> contains   "./unum/kiv-unum-409befe069ac/nose-1.2.1-py2.7.egg/EGG-INFO"
19a24
> contains   "./unum/kiv-unum-409befe069ac/nose-1.2.1-py2.7.egg/nose"
30a36
> contains   "./unum/kiv-unum-409befe069ac/Unum.egg-info"

「処理」行に違いはないことに注意してください。

于 2013-02-15T18:20:33.900 に答える
5

私は自分の質問に答えて、最終的にそれを受け入れるつもりです。説明されている一見奇妙な動作は、微妙なインデントの問題によって引き起こされました。その可能性は、ユーザー@delnanによって最初に私の注意を引きました。見えなかったので、最初はそうは思わなかったのですが、調べてみるとわかりました。その詳細は私の質問の最後に追加されました。

于 2013-02-15T22:00:39.810 に答える