Qu'est-ce que le pythonic façon à éviter les effets d'ombre variables?
Souvent j'ai le code suivant qui conduit soit à la variable d'ombrage ou à une multiplication des variables locales
def whenadult(age):
return 18 - age
age = 5
needtowait = whenadult(age)
age
a la même logique rôle à la fois lorsqu'il est passé à la fonction, comme dans le code principal donc je voudrais éviter de créer quelque chose comme l_age
dans whenadult.
Quel est le pythonic façon de résoudre le "shadowing ou variable multiplication" dilemme?
Mise à JOUR: suite à certains commentaires, je tiens à préciser que j'ai été la recherche d'un Python de bonnes pratiques (par opposition à local vs global portée de variables)
- Je suis confus - pourquoi auriez-vous besoin pour créer un l_age variable dans le whenadult fonction?
- Votre problème n'est pas de conduire à une multiplication des variables locales, et je ne suis même pas sûr de savoir comment il pourrait l'être.
- (Je vais sauter le "downvote sans commentaire" coup de gueule) -- ce que je voulais dire, c'est la création d'une nouvelle nommée variable locale (
l_age
) pour éviter les effets d'ombreage
plutôt que de réutiliser le même nom. - Sans doute celui qui downvoted vous l'avez fait sur la base de l'un des deux commentaires existants (ou sur l'autre que l'habitude d'être là que quelqu'un a supprimé plus tard). Dans ce cas, l'ajout d'un "ce qu'il a dit" commentaire n'a pas vraiment d'ajouter quoi que ce soit.
Vous devez vous connecter pour publier un commentaire.
Le fait que la variable locale (et paramètre de la fonction)
age
arrive à avoir le même nom qu'une variable quelque part d'autre dans votre programme n'est pas pertinent. Le point de l'ensemble de variables locales, c'est qu'ils ne vivent que dans les locaux de la portée de la fonction qu'ils sont définis dans.Le fait que la variable locale a le même nom que la variable utilisée ailleurs comme un argument est surtout pas un problème. En fait, il est très commun dans la vie réelle de code. Par exemple, le choix d'un hasard stdlib module, la version 3.3 de
cmd
, leCmd.onecmd
méthode a une variable nomméeline
, et il passe en argument à laself.default
méthode, qui se lie à un paramètre qui est également nomméline
.Le fait que la variable utilisée pour l'argument se trouve être une variable globale que vous pourrait avoir accessible, si vous n'avez pas une variable locale de même nom, n'est pas un problème, sauf si vous avez réellement voulu accéder à cette variable globale. Qui vous ne voulez pas dans votre code, et presque jamais devrait souhaitez. Dans ce cas, et dans la plupart du monde réel des cas, il s'agit simplement d'une coïncidence qui ne veut rien dire et affecte rien, pas un problème que vous devez résoudre.
Le problème que vous rencontrez est que PyCharm ne peut pas deviner si tu voulais le mondial
age
accessibles danswhenadult
. Est-il possible (si ce n'est dans ce cas trivial, peut-être dans des cas plus complexes) qu'un humain peut même être confus, ce qui ralentit sa compréhension de votre code? Ou que vous aurez un jour avoir à écrire du code dans certains environnement où votre code réviseurs ou de l'enseignant ou de ce qui te permettra de rejeter votre code car il ne passe pas certains linter avec aucun avertissement? Peut-être.Mais vraiment, dans un tel environnement, qu'ils avaient probablement se plaindre de vous à l'aide de variables globales dans la première place. Et vous n'avez pas vraiment besoin ici. La seule raison pour laquelle
age
est mondial, c'est qu'il doit être accessible pour le haut-niveau code. Si vous déplacez ce code dans une fonction,age
peut devenir un local dans cette fonction. Par exemple:Cela fera PyCharm heureux, et tout linter outils, et le tout facilement confondre ou rigide d'esprit des lecteurs humains. Il va même faire votre code un tout petit peu plus rapide. D'autre part, c'est plus de code à lecture seulement trois lignes et un tiret, mais alors tout le programme est à seulement huit lignes de long. Donc, c'est un compromis que vous pouvez faire au cas par cas.
var=var
à la fonctiondef fun(var=var):
afin que je puisse l'utiliser dansfun
portée, mais Pycharm se plaint de l'occultation de nouveau. Je ne peux même pas utiliserglobal
parce que lefun
est défini à côté d'une autre fonction, non pas dans la portée globale.fork
etspawn
démarrer méthodes (malheureusement, si vous utilisez 2.x ou un début de 3.x, la seule façon de le faire est d'exécuter sur *nix et Windows, ce qui introduit d'autres différences...); je parie qu'il tourne un involontairement communs à l'échelle mondiale.def fun(othername=var):
et l'utilisationothername
dans le corps pour obtenir exactement le même effet. Personnellement, je pense que c'est parfois plus lisible avecvar=var
, tout comme vous à l'évidence et je pense que la plupart des programmeurs Python serait d'accord avec nous—mais encore une fois, les linters être mécanique; ils ne peuvent pas faire le jugement d'appel, que, dans ce cas, la lisibilité des prestations de nom parfait pour la variable emportent sur les coûts potentiels de l'observation d'un nom, donc ils ont juste le signaler. Si vous voulez faire de votre linter heureux, vous avez à jouer selon ses règles..pyi
fichier de sorte qu'il fonctionne avec 2.x) alors créer.pyi
fichiers à l'aide des linters.Chaque fois que j'ai eu l'avertissement de l'observation de la variable dans PyCharm. Je voudrais essayer de renommer la variable locale à utiliser le trait de soulignement préfixe de la convention. C'est une autre façon d'envisager en outre, pour envelopper les variables globales dans une fonction main ().