Bonjour à tous. Si \ _ \ _ nom \ _ \ _ == '\ _ \ _ main \ _ \ _', levez la main si vous écrivez le code paresseusement A dépassé 100 likes, merci. Maître, j'ai quelque chose à dire à tout le monde.
Tout le monde, l'avertissement «Nom des ombres» est ignoré. Expliquez l'horreur du «nom des ombres» causée par la pollution de la portée globale.
Désolé pour l'exemple délicat, mais supposons que vous ayez le code suivant:
import sys
def process(n):
x = 0
# ...Traitement divers
if x > 1:
n *= 10
# ...Traitement divers
return n
if __name__ == '__main__':
for x in sys.argv[1:] or [1, 2, 3]:
process(int(x))
Pour une raison quelconque, je n'ai plus besoin de démarrer la fonction de processus, j'ai donc commenté la variable x
.
Cependant, j'ai négligé la variable «x» qui était enfouie dans le code à l'étape intermédiaire.
def process(n):
#Commentez ici
# x = 0
# ...Traitement divers
# !!!!J'ai oublié de commenter!!!!
if x > 1:
n *= 10
# ...Traitement divers
return n
Dans ce cas, «x» est référencé comme une variable globale, donc aucune erreur ne se produit et l'outil d'analyse statique ne la détecte pas.
Des erreurs simples en Python peuvent être détectées par une analyse statique à 99%, mais Shadows name
est un vilain bogue qui s'y glisse.
Le contournement de l'analyse statique nécessite un grand soin pour commenter une chose.
** Ne rejetez donc pas les spécifications de langage du professeur Python. ** **
Bien sûr, l'exemple précédent était une situation extrême, mais c'est tout à fait possible. Si vous courez le risque de provoquer un bug aussi désagréable, il est plus facile de l'envelopper dans une fonction dès que possible sous ʻif name == '__ main __' `.
En fait, un outil comme PyCharm qui effectue une analyse statique en temps réel vous avertira lorsque vous écrivez votre code, ce problème peut donc ne pas se produire très souvent.
Cependant, si vous ignorez l'avertissement ou le désactivez, cela se produira. Enseignant silencieux PyCharm ...
Les outils d'analyse statique de Python évitent des bogues parfois déroutants. Il est important de garder votre code dans un état vert afin de ne pas submerger l'avertissement.
En premier lieu, ʻif name == '__ main __' `est l'endroit où écrire le processus que vous voulez exécuter uniquement dans l'environnement de script de niveau supérieur.
Donc, ce qu'est un script de niveau supérieur est le ** "module principal" ** qui s'exécute directement à partir de Python. Les scripts importés du module principal ou d'autres scripts sont simplement appelés ** "modules" **.
https://docs.python.jp/3/tutorial/modules.html
Les scripts qui s'exécutent uniquement en tant que module principal n'ont fondamentalement pas besoin de ʻif name == '__ main__. Puisque
name ne peut contenir que
main`, il est inutile d'écrire simplement une instruction if.
** "Ensuite, vous n'avez pas besoin d'écrire ʻif name == '__ main__` dans le module principal" **
Ce sera.
L'opinion de l'enseignant est ** "Si vous voulez écrire du code dans le module principal, vous devez écrire ʻif name == '__ main__`" **.
Par exemple, si vous disposez du module principal suivant:
import sys
def main(args=sys.argv):
#Quel bordel
return 0
if __name__ == "__main__":
sys.exit(main())
Il s'agit d'un processus typique du module principal. ʻSi name == Le module principal sans '__ main__` ressemble à ceci:
import sys
def main(args=sys.argv):
#Quel bordel
return 0
sys.exit(main())
Les deux font la même chose, mais le deuxième module principal n'a qu'un seul problème.
** Les autres ne peuvent pas patcher les singes **
à propos de ça.
Monkey patch est une technique qui détourne le comportement d'une bibliothèque existante et la réécrit dynamiquement.
[Monkey Patch Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%A2%E3%83%B3%E3%82%AD%E3%83%BC%E3%83%91%E3 % 83% 83% E3% 83% 81)
Voir l'article de l'enseignant pour un exemple de patch de singe.
J'ai créé "sphinx-quickstart-plus" pour faciliter la documentation de Sphinx
En d'autres termes, quand quelqu'un d'autre veut étendre votre script, sans ʻif name == '__ main__`, le code sera difficile à corriger.
Supposons que vous ayez un module principal appelé ʻa.py` comme ceci:
a.py
import sys
def main(args=sys.argv):
#Quel bordel
return 0
sys.exit(main())
Si vous essayez d'importer cette fonction ʻa.main` comme un patch de singe (extension), le programme se terminera.
monkey.py
import a
print("monkey patch")
a.main([])
Par conséquent, il est plus sûr (non obligatoire) d'écrire ʻif name == '__ main__ dans le module principal également. Cependant, ʻif __name__ == '__ main__
n'est pas nécessaire pour l'exemple de code et le code abandonné.
Ce sont les deux choses que l'enseignant veut dire.
――Dirty global scope est un acte qui réduit la fiabilité de l'analyse statique, Guilty! --Il est plus sûr d'écrire ʻif name == '__ main__` même dans le module principal
c'est tout.
Recommended Posts