Avant d'expliquer quoi que ce soit à ce sujet, if __name__ == '__main__'
il est important de comprendre ce qui __name__
est et ce qu'il fait.
Qu'est-ce que c'est __name__
?
__name__
est un DunderAlias - peut être considéré comme une variable globale (accessible à partir des modules) et fonctionne de manière similaire à global
.
C'est une chaîne (globale comme mentionné ci-dessus) comme indiqué par type(__name__)
(cédant <class 'str'>
), et est une norme intégrée pour les versions Python 3 et Python 2 .
Où:
Il peut non seulement être utilisé dans les scripts, mais aussi dans l'interpréteur et les modules / packages.
Interprète:
>>> print(__name__)
__main__
>>>
Scénario:
test_file.py :
print(__name__)
Résultant en __main__
Module ou package:
somefile.py:
def somefunction():
print(__name__)
test_file.py:
import somefile
somefile.somefunction()
Résultant en somefile
Notez que lorsqu'il est utilisé dans un package ou un module, __name__
prend le nom du fichier. Le chemin d'accès du module ou du package n'est pas indiqué, mais possède son propre DunderAlias __file__
, ce qui permet cela.
Vous devriez voir que, où __name__
, où il est, le fichier principal (ou programme) retournera toujours__main__
, et s'il s'agit d'un module / package, ou de tout ce qui s'exécute sur un autre script Python, retournera le nom du fichier où il est originaire de.
Entraine toi:
Être une variable signifie que sa valeur peut être écrasée ("peut" ne signifie pas "devrait"), écraser la valeur de __name__
entraînera un manque de lisibilité. Alors ne le faites pas, pour quelque raison que ce soit. Si vous avez besoin d'une variable, définissez une nouvelle variable.
Il est toujours supposé que la valeur de __name__
soit __main__
ou le nom du fichier. Une fois de plus, la modification de cette valeur par défaut provoquera plus de confusion que cela fera du bien, causant des problèmes plus loin.
exemple:
>>> __name__ = 'Horrify' # Change default from __main__
>>> if __name__ == 'Horrify': print(__name__)
...
>>> else: print('Not Horrify')
...
Horrify
>>>
Il est généralement considéré comme une bonne pratique d'inclure les if __name__ == '__main__'
scripts dans.
Maintenant pour répondre if __name__ == '__main__'
:
Nous savons maintenant que le comportement des __name__
choses devient plus clair:
An if
est une instruction de contrôle de flux qui contient le bloc de code qui s'exécutera si la valeur donnée est vraie. Nous avons vu que cela __name__
peut prendre soit
__main__
le nom de fichier à partir duquel il a été importé.
Cela signifie que si __name__
est égal à, __main__
le fichier doit être le fichier principal et doit être en cours d'exécution (ou c'est l'interpréteur), et non un module ou un package importé dans le script.
Si en effet __name__
prend la valeur de __main__
alors tout ce qui se trouve dans ce bloc de code s'exécutera.
Cela nous indique que si le fichier en cours d'exécution est le fichier principal (ou si vous exécutez directement depuis l'interpréteur), cette condition doit s'exécuter. S'il s'agit d'un package, il ne devrait pas l'être et la valeur ne le sera pas __main__
.
Modules:
__name__
peut également être utilisé dans les modules pour définir le nom d'un module
Variantes:
Il est également possible de faire d'autres choses moins courantes mais utiles avec __name__
, certaines que je montrerai ici:
Exécution uniquement si le fichier est un module ou un package:
if __name__ != '__main__':
# Do some useful things
Exécuter une condition si le fichier est le principal et une autre s'il ne l'est pas:
if __name__ == '__main__':
# Execute something
else:
# Do some useful things
Vous pouvez également l'utiliser pour fournir des fonctions / utilitaires d'aide exécutables sur les packages et les modules sans l'utilisation complexe de bibliothèques.
Il permet également d'exécuter des modules à partir de la ligne de commande en tant que scripts principaux, ce qui peut également être très utile.
if __name__ == "__main__":
condition de bloc a- t-elle été déconseillée / obsolète jusqu'à Python 3? J'ai trouvé des informations le confirmant.