2017-03-24 16 views
4

Pythonの三重アンダースコアには何か重要な意味がありますか?このpython forループにトリプルアンダースコアの意味はありますか?

これはディレクトリ内のすべてのファイル.txtを取得するためのスクリプトにあります。

for ___,___,files in os.walk(some_folder): 
    files[:]=[x for x in files if x.lower().endswith('txt')] 
    for file in files: 

単一のアンダースコアが正常に捨てる変数に使用され、ここで他の質問を読んで、トリプルアンダースコアだけ悪い習慣のこの使用であるか、またはそれに意義があるのでしょうか?

答えて

5

シングル、ダブル、トリプル、およびスクリプト内の任意のアンダースコアのみの名前は、暗黙的に値が使用されないことを意味します(任意の文字を使用して「名前」が与えられないという事実は、 )。

これはもちろん、石で設定されていません(つまり、Pythonはのような名前とは別のものとして___を扱いません)。代わりにプログラマがよく理解し、尊重する慣習です。

単一のアンダースコアは、対話モードでのみ使用され、__または___の代わりにスクリプトで使用されるものです。 _____を使ってみると、醜く見えますが、実際はまったく必要ありません。なぜ誰かがそれを使用することに決めるのか分かりません。_;それらをコピーせず、同じメッセージを取得する必要があるときは_を選択してください。

+0

2行目の[:]も冗長であると思いますか? – Notts90

+1

@ Notts90は'ファイル 'をインプレースで変更します。 –

+0

'_'の代わりに' __'を使う主な理由の1つは、gettextを使っているのですが、 '_'は通常翻訳機能です。 –

3

ジム氏によると、___という構文は、通常、その名前でキャプチャされたもの(___)は役に立たない、またはごみです。

test 
    subtest1 
     file1.txt 
     file2.txt 
    subtest2 
     file3.txt 

私はos.walktestに使用したときに何が起こるか見て:次のような構造で、私は、フォルダ、testを持って

:完全を期すために、次の例を見てみましょう

>>> list(os.walk('test')) 
[('test', ['subtest1', 'subtest2'], ['.DS_Store']), ('test/subtest1', [], ['file1.txt', 'file2.txt']), ('test/subtest2', [], ['file3.txt'])] 
>>> len(list(os.walk('test'))) 
3 

したがって、技術的には、ジェネレータには、os.walk('test')によって返される3つの要素があります。しかし、いくつかのネストされたデータ構造がはっきり分かるので、各要素内にいくつの要素がありますか?

>>> [len(x) for x in os.walk('test')] 
[3, 3, 3] 

いいえ、それぞれの要素には、os.walk('test')という3つのサブ要素があります。例えば、list(os.walk('test'))[0]には、'test'(第1の要素)、['subtest1', 'subtest2'](第2の要素)、および['.DS_Store'](第3の最終要素)があります。最後の要素には、最初の要素で指定されたフォルダ内のディレクトリ以外のファイルが含まれます(したがって、.DS_Storeはtestディレクトリのファイルです)。

(私はまだアンダースコアを使用しません)さんは、その後、あなたのforループに取得してみましょう:

>>> for main_dir, sub_dirs, files in os.walk('test'): 
...   print("Main directory: ", main_dir) 
...   print("Sub-directories: ", ', '.join(sub_dirs)) 
...   print("Files: ", ', '.join(files)) 
... 
Main directory: test 
Sub-directories: subtest1, subtest2 
Files: .DS_Store 
Main directory: test/subtest1 
Sub-directories: 
Files: file1.txt, file2.txt 
Main directory: test/subtest2 
Sub-directories: 
Files: file3.txt 

のでfor main_dir, sub_dirs, files in os.walk('test')構文は我々が呼ん本当に「開梱。」私たちはmain_dirの最初の要素をos.walk('test')に、sub_dirsの2番目の要素に割り当てようとしています(_)。これは読者に「私が必要とするものを忘れました。 。"あなたの場合、コードは、「これらのファイルが存在するディレクトリを忘れている。私はちょうどファイル名がほしいのです。 "

関連する問題