Shadows nom xyz de la portée externe
Je suis en utilisant pycharm
et il fait la liste de toutes les erreurs/avertissements associés avec le code. Bien que je comprenne la plupart d'entre eux, je ne suis pas sûr de ce "Ombres nom xyz de l'extérieur de la portée". Il y a DONC quelques posts au sujet de cette: Comment le mauvais est l'occultation de noms définis dans des étendues extérieures? mais ensuite ils semblent être l'accès à une variable globale.
Dans mon cas, mon __main__
fonction a quelques noms de variable et puis c'est l'appel d'une autre fonction sample_func
qui utilise ces noms de variables à nouveau (principalement la boucle noms de variables). Je suis en supposant que parce que je suis dans une autre fonction, la portée de ces variables sont locales, cependant la mise en garde semble indiquer le contraire.
Toute pensée? Pour référence, voici un peu de code:
def sample_func():
for x in range(1, 5): --> shadows name x from outer scope
print x
if __name__ == "__main__":
for x in range(1, 5):
sample_func()
source d'informationauteur The Wanderer | 2015-07-22
Vous devez vous connecter pour publier un commentaire.
L'avertissement sur le danger potentiel de la présentation par la ré-utilisation de ces noms à l'intérieur des zones. Il peut vous amener à manquer d'un bug. Prenons l'exemple de cette
Parce que vous avez utilisé le même nom, de votre faute d'orthographe à l'intérieur de la fonction ne pas provoquer une erreur.
Lorsque votre code est très simple, vous vous en sortirez avec ce type de chose, sans conséquences. Mais c'est bien d'utiliser ces "meilleures pratiques" afin d'éviter les erreurs sur un code plus complexe.
Le code à l'intérieur de votre si la branche de votre principale fonction est en fait dans le champ d'application lorsque vous êtes à l'intérieur de sample_func. Vous pouvez lire à partir de la variable
x
(essayer). Ce n'est pas grave tant que vous n'avez pas vraiment à elle de sorte que vous avez un peu d'options pour aller de l'avant.1) Désactiver l'occultation des avertissements dans pycharm. Honnêtement, c'est le plus simple et en fonction de leur degré d'expérience d'un codeur vous êtes probablement fait le plus de sens (si vous êtes relativement nouveau je ne voudrais pas faire cela.)
2) Mettez votre code principal dans une fonction principale. C'est probablement la meilleure solution pour tout niveau de production de code. Python est très bon à faire les choses de la façon dont vous voulez faire de sorte que vous devez être prudent de ne pas tomber dans les pièges. Si vous êtes à la construction d'un module, d'avoir beaucoup de logique au niveau du module peut vous amener des situations délicates. Au lieu de cela, quelque chose comme ce qui suit pourrait vous être utile:
3) Ne pas utiliser les mêmes noms de variables que vous utilisez dans de larges étendues. C'est assez difficile à appliquer et est un peu l'opposé du n ° 1.
C'est juste une avertissementcomme expliqué dans la question, il y a des moments où il peut causer des problèmes, mais dans votre cas
x
est local à votre fonction. Vous êtes l'obtention de l'avertissement à cause de lax
à l'intérieur de votreif __name__ == "__main__":
être en reste. Il n'aura aucun effet sur lax
dans votre fonction donc je ne voudrais pas vous inquiéter au sujet de l'avertissement.Je sais que c'est un vieux thread et ce n'est pas appropriée pour le problème à la personne a été d'essayer de trouver, mais j'étais à la recherche d'une réponse à pourquoi PyCharm m'avait montré une Ombre de nom de l'étendue de message sur un complexe if/elif bloc d'instructions...
Il s'avère que j'avais capitalisé certaines mondiale des noms de variables au début de la fonction, mais utilisé en minuscules dans mon if/elif bloc beaucoup plus bas dans la fonction.
Garçon de l'école d'erreur je sais, mais une fois que j'ai corrigé cela, l'Ombre de nom de l'étendue message PyCharm disparu et les variables de cesse de montrer que grisé...
Donc la leçon que j'ai apprise, c'est que ce PyCharm message peut être causée par quelque chose d'aussi simple que d'un upper/lower cas d'erreur dans un nom de variable...
Je ne l'ai réalisé que le problème alors que j'étais à la rupture de la fonction en trois fonctions, afin de voir si cela permettrait de supprimer les Ombres...' erreur, comme je le pensais, j'ai eu un problème avec la mise en retrait et c'était la cause du problème!
Cela peut aider un autre débutant qui est de se gratter la tête en se demandant pourquoi ils sont l'obtention de cette erreur 🙂