2017-03-24 5 views
4

Y a-t-il une signification dans le trait de soulignement triple en Python?Y at-il une signification des traits de soulignement triple dans ce python pour la boucle?

Ceci était dans un script pour obtenir tous les fichiers .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: 

La lecture d'autres questions sur ici un trait de soulignement unique est normalement utilisé pour deux pas des variables, est cette utilisation d'un trait de soulignement triple juste une mauvaise pratique ou est-il une importance pour elle?

Répondre

5

Simple, double, triple et, en général, toute quantité de caractères de soulignement seulement dans un script signifie implicitement que la valeur ne sera pas utilisée (le fait qu'il ne soit pas donné un "nom" en utilisant des lettres signifie ceci). Ceci n'est, bien sûr, pas gravé dans la pierre (c'est-à-dire que Python ne traite pas différemment un nom comme) mais plutôt une convention que les programmeurs comprennent et respectent généralement.

Le trait de soulignement unique a un but uniquement en mode interactif et c'est celui qui est employé dans les scripts au lieu de __ ou ___. En utilisant ___ et __ juste l'air laid et vraiment complètement inutile; Je ne vois pas pourquoi quelqu'un déciderait de l'utiliser sur _; ne les copiez pas et optez pour _ lorsque vous avez besoin de faire passer le même message.

+0

Merci, ai-je raison de penser que le [:] sur la ligne 2 est également redondant? – Notts90

+1

@ Notts90 qui change' fichiers' sur place, je ne sais pas pourquoi l'auteur a décidé ils ont besoin de faire cela, donc je suis d'accord que, d'après ce que je peux voir, c'est redondant –

+0

Une raison courante d'utiliser '__' au lieu de' _' est si vous utilisez gettext où '_' est généralement la fonction de traduction . –

3

Comme l'a dit Jim, la syntaxe ___ signifie généralement tout ce qui est capturé par ce nom (___) n'est pas utile, ou est garbage. Jetez un oeil à 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 quand 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 retournés par os.walk('test'). Combien y a-t-il d'éléments dans 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 de 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épertoire dans quel dossier est désigné par le premier élément (donc .DS_Store est un fichier dans le répertoire test).

Obtenons à votre boucle for, alors (je ne vais pas utiliser les underscores encore):

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

Donc, la syntaxe for main_dir, sub_dirs, files in os.walk('test') est vraiment ce que nous appelons « déballer ». Nous attribuons à main_dir le premier élément dans os.walk('test'), à sub_dirs le deuxième élément, etc. La syntaxe ___ (qui devrait vraiment être juste _), dit au lecteur, "Oubliez ces valeurs, j'ai nommé ceux 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. "