[PYTHON] Si __name__ == Levez la main, si vous écrivez le code sous '__ main__'

bonne année. Au début de la nouvelle année, j'ai quelque chose à vous dire, enseignants.

Dans le code python, levez la main si vous écrivez le code sous if \ _ \ _ name \ _ \ _ == '\ _ \ _ main \ _ \ _'.

Comme ça, quelqu'un qui écrit du code sous if \ _ \ _ name \ _ \ _ == '\ _ \ _ main \ _ \ _'.

#! usr/bin/python
# -*- coding: utf-8 -*-
from __future__ import unicode_literals, print_function, absolute_import
import sys


def say_args(kind, data_list):
    print("kind:", kind, " data:", data_list)


if __name__ == '__main__':
    args = sys.argv[1:]
    assert args

    kind = args[0].lower()
    data_list = [x.lower() for x in args[1:]]

    say_args(kind, data_list)

Les gens qui écrivent un tel code, les enseignants, ne vous fâchez pas, alors levez la main.

Avez-vous remarqué qu'un tel code ** pollue l'espace de noms global scope **? Si vous en êtes conscient et que vous le comprenez avant d'écrire, vous pouvez laisser tomber votre main.

si \ _ \ _ nom \ _ \ _ == '\ _ \ _ main \ _ \ _'Voici la portée globale

Oui, si \ _ \ _ nom \ _ \ _ == '\ _ \ _ main \ _ \ _'Voici la portée globale. Les variables qui y sont définies sont ** toutes les variables globales **.

Dans le code ci-dessus, args, `kind```,` `data_list```, qui sont censés être des variables locales, deviennent des variables globales. Par conséquent, l'écriture du code suivant ne provoquera pas d'erreur.

def say_args(kind, data_list):
    print("kind:", kind, " data:", data_list)
    #La variable globale args est référencée, ce qui n'entraîne pas d'erreur lors de la référence à des args non définis
    print("args: ", args)

C'est une source de bogues ennuyeux, pas une erreur lors de l'exécution directe, mais une erreur de nom lorsqu'il est appelé en tant que module.

** Ne rejetez donc pas les spécifications du langage des professeurs de python. ** **

Le Dr PyCharm est également en colère à propos de cette affaire, disant: «Les ombres nomment« genre »forment la portée extérieure».

2017-01-01_11h04_25.png

Solution

Si vous voulez écrire du code sous if \ _ \ _ name \ _ \ _ == '\ _ \ _ main \ _ \ _', enveloppez-le dans une fonction.

#! usr/bin/python
# -*- coding: utf-8 -*-
from __future__ import unicode_literals, print_function, absolute_import
import sys


def main(args):
    assert args

    kind = args[0].lower()
    data_list = [x.lower() for x in args[1:]]

    say_args(kind, data_list)


def say_args(kind, data_list):
    print("kind:", kind, " data:", data_list)


if __name__ == '__main__':
    main(sys.argv[1:])

L'espace de noms global scope n'est pas pollué en l'enveloppant dans la fonction main. De plus, en l'enveloppant dans la fonction principale, vous pouvez écrire le processus principal au début, ce qui améliore la visibilité du code.

Si vous êtes nouveau dans Python, vous pouvez l'envelopper en toute sécurité dans une fonction.

Si vous êtes inquiet pour autre chose, utilisez PyCharm-sensei, c'est comme une petite belle-mère ... ~~ pyflask Sensei ~~ pyflakes Sensei et pylint Sensei sont bien, mais le pylint Sensei est plus strict. (Correction 1/1: il n'y a pas de professeur pyflask, c'était une erreur de professeur pyflakes)

C'est tout ce que le professeur voulait dire.

Ensuite, si vous dites: «Si vous l'enveloppez dans la fonction principale, vous pouvez créer une fonction principale inutile lorsque vous voulez l'utiliser comme module», discutons-en individuellement avec le professeur plus tard dans la salle des professeurs.

J'ai écrit un cours de maquillage

[[Conférence supplémentaire] Si \ _ \ _ nom \ _ \ _ == '\ _ \ _ main \ _ \ _', veuillez lever la main](http://qiita.com/pashango2/ articles / 3834221353e4d25e0d69)

2017-01-02 Corrigé à propos de la variable "x"

Nous corrigerons cela en réponse au commentaire de M. knoguchi. Si vous apportez des corrections à l'article, il sera difficile de lire l'article, il a donc été déplacé à la fin de la phrase.

** [Phrase avant correction] ** Dans le code ci-dessus, args, `kind```,` data_list```, qui est conçu comme une variable locale, ~~ même la variable temporaire `x``` ~~ global Cela devient une variable.

def say_args(kind, data_list):
    print("kind:", kind, " data:", data_list)
    #Une variable globale x est référencée qui n'entraîne pas d'erreur lors de la référence à un x indéfini
    print("x: ", x)

x``` utilisé dans la notation d'inclusion ne sera pas une variable globale, cela entraînera une erreur.

Cependant, cela ne semble pas causer d'erreur lors de l'exécution de PyCharm, car PyCharm réutilise les trames globales pour la vitesse. C'est une leçon que la vérification des résultats ne doit pas être effectuée uniquement sur PyCharm.

Je tiens à remercier à nouveau M. knoguchi. "La fuite de variable de complétion de liste est un problème de reliure" dans le commentaire est l'un des points addictifs dans la notation d'inclusion, donc s'il vous plaît voir aussi le commentaire.

Recommended Posts

Si __name__ == Levez la main, si vous écrivez le code sous '__ main__'
[Cours supplémentaire] Si __name__ == Si vous écrivez le code sous «__ main__», levez la main.
[Python débutant] Si __name__ == Déplacez votre main pour comprendre '__ main__'.
Si vous souhaitez que vos collègues utilisent la même langue
Si vous montez sur le Titanic ... vous mourez.
Vérifiez le nom du fichier si l'importation Python vous dit que vous ne pouvez pas
Si vous pensez que l'environnement PyCharm est cassé, c'est à cause du nom du fichier
Si vous écrivez View decorator dans urls.py dans Django, la liste sera plus élevée.
Si vous en savez beaucoup, vous pouvez écrire du code de test Python! ~ Super édition d'introduction ~