4 votes

Les triples traits de soulignement dans cette boucle for en python ont-ils une signification ?

Le triple trait de soulignement a-t-il une signification en Python ?

C'était dans un script pour obtenir toutes les .txt dans un répertoire.

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

En lisant d'autres questions ici, un simple trait de soulignement est normalement utilisé pour les variables inutiles. L'utilisation d'un triple trait de soulignement est-elle simplement une mauvaise pratique ou a-t-elle une signification ?

5voto

Jim Points 8793

Les noms simples, doubles, triples et, en général, toute quantité de noms soulignés dans un script signifient implicitement que la valeur ne sera pas utilisée (le fait qu'elle ne reçoive pas de "nom" utilisant des lettres le signifie).

Ceci n'est, bien sûr, pas gravé dans le marbre (c'est-à-dire que Python ne traite pas les ___ différemment d'un nom comme foo ), mais c'est une convention que les programmeurs comprennent et respectent généralement.

Le trait de soulignement simple n'a de raison d'être qu'en mode interactif et c'est celui qui est employé dans les scripts au lieu de __ o ___ . En utilisant ___ y __ sont tout simplement laids et complètement inutiles ; je ne vois pas pourquoi quelqu'un déciderait de les utiliser plutôt que de les utiliser. _ ; ne pas les copier et opter pour _ lorsque vous devez faire passer le même message.

3voto

blacksite Points 4779

Comme l'a dit Jim, le ___ signifie généralement tout ce qui est capturé par ce nom ( ___ ) n'est pas utile ou est un déchet. Prenons l'exemple suivant, par souci d'exhaustivité :

J'ai un dossier, test avec la structure suivante :

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

Regardez ce qui se passe lorsque j'utilise os.walk sur 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

Il y a donc techniquement trois éléments dans le générateur renvoyé par os.walk('test') . Combien y a-t-il d'éléments à l'intérieur de chaque élément, puisque nous voyons clairement des structures de données imbriquées ?

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

D'accord, il y a trois sous-éléments dans chaque élément de os.walk('test') . Par exemple, à list(os.walk('test'))[0] , il y a 'test' (le premier élément), ['subtest1', 'subtest2'] (le deuxième élément), et ['.DS_Store'] (le troisième et dernier élément). Le dernier élément contient les fichiers non répertoriés dans le dossier désigné par le premier élément (ainsi, .DS_Store est un fichier dans le dossier test ).

Venons-en à votre for alors (je n'utiliserai pas encore les underscores) :

>>> 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

Ainsi, le for main_dir, sub_dirs, files in os.walk('test') La syntaxe est en fait ce que l'on appelle le "déballage". Nous assignons à main_dir le premier élément de os.walk('test') , à sub_dirs le deuxième élément, etc. Le ___ (qui devrait être simplement _ ), dit au lecteur : "Oubliez ces valeurs ; j'ai nommé celles dont j'ai besoin". Dans votre cas, le code dit : "Oubliez les répertoires d'où proviennent ces fichiers ; je veux juste les noms de fichiers eux-mêmes".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X