Есть ли какое-то значение в тройном подчеркивании в Python?

Это было в сценарии для получения всех .txt файлов в каталоге.

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

Чтение других вопросов здесь, единственное подчеркивание обычно используется для отбрасывания переменных, является ли использование тройного подчеркивания просто плохой практикой или имеет значение для этого?

4
Notts90 supports Monica 24 Мар 2017 в 15:04

2 ответа

Лучший ответ

Одинарные, двойные, тройные и, в общем, любое количество имен только подчеркивания в скрипте неявно означает, что значение не будет использоваться (тот факт, что ему не дано «имя» с использованием каких-либо букв, означает это).

Это, конечно, не в камне (то есть Python не трактует ___ иначе, чем имя, подобное foo), вместо этого это соглашение, которое программисты обычно понимают и уважают.

Единственное подчеркивание имеет цель только в интерактивном режиме, и именно оно используется в скриптах вместо __ или ___. Использование ___ и __ выглядит ужасно и действительно совершенно не нужно; Я не понимаю, почему кто-то решил использовать его поверх _; не копируйте их и выбирайте _, когда вам нужно передать одно и то же сообщение.

5
Dimitris Fasarakis Hilliard 24 Мар 2017 в 14:19

Как сказал Джим, синтаксис ___ обычно означает, что все, что захвачено этим именем (___), бесполезно или является мусором. Для полноты картины рассмотрим следующий пример:

У меня есть папка test со следующей структурой:

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

Посмотрите, что происходит, когда я использую os.walk на 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'). Сколько элементов в каждом элементе, хотя мы ясно видим некоторые вложенные структуры данных?

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

Хорошо, в каждом элементе os.walk('test') есть три подэлемента. Например, в list(os.walk('test'))[0] есть 'test' (первый элемент), ['subtest1', 'subtest2'] (второй элемент) и ['.DS_Store'] (третий и последний элемент). Последний элемент содержит файлы вне каталога в любой папке, обозначенной первым элементом (поэтому .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 второй элемент и т. Д. Синтаксис ___ (который действительно должен быть просто _) говорит читателю: «Забудьте об этих ценностях; я назвал те, которые мне нужны». В вашем случае код говорит: «Забудьте о каталогах, из которых эти файлы берутся; я просто хочу сами имена файлов».

3
blacksite 24 Мар 2017 в 13:39