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.
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».
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.
[[Conférence supplémentaire] Si \ _ \ _ nom \ _ \ _ == '\ _ \ _ main \ _ \ _', veuillez lever la main](http://qiita.com/pashango2/ articles / 3834221353e4d25e0d69)
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