Raison pour globals() en Python?
Quelle est la raison d'avoir globals() fonction en Python? Il ne renvoie dictionnaire des variables globales qui sont déjà mondial, de sorte qu'ils peuvent être utilisés n'importe où... je vous demande seulement de la curiosité, en essayant d'apprendre le langage python.
def F():
global x
x = 1
def G():
print(globals()["x"]) #will return value of global 'x', which is 1
def H():
print(x) #will also return value of global 'x', which, also, is 1
F()
G()
H()
Je ne vois pas vraiment le point ici? Seul le temps j'en aurais besoin, si j'avais des variables locales et globales, avec le même nom pour les deux
def F():
global x
x = 1
def G():
x = 5
print(x) #5
print(globals()["x"]) #1
F()
G()
Mais vous ne devriez jamais vous rencontrez un problème d'avoir deux variables avec le même nom, et qui ont besoin d'utiliser les deux dans le même champ d'application.
- "Mais vous ne devriez jamais vous rencontrez un problème d'avoir deux variables avec le même nom, et qui ont besoin d'utiliser les deux dans le même champ d'application." Je ne peux pas suivre cette pensée. C'est la raison pour séparer les espaces de noms, que vous avez variables avec le même nom dans différents champs d'application. Lorsque vous travaillez avec deux d'entre eux, des noms en double sont une chose naturelle, mais pas un problème, comme vous pouvez le préfixe eux.
- Eh bien, je viens de la famille C++, donc je ne suis pas sûr à propos de Python personnes, mais aussi loin que je peux penser, vous ne devriez pas avoir de global variable qui n'a pas un nom unique. Sûr qu'il y aura des variables avec le même nom, dans le même contexte, que c'était stupide phrase de moi, mais pas de variables globales avec les mêmes noms que ceux des locaux. C'est quand je l'avais utiliser des espaces de noms pour les locaux... Mais vous ne savez pas, si vous le dis.
globals
est peut-être un peu trompeur.globals()
est essentiellement lelocals()
d'un module. Le plus proche de Python vient de variables globales qui sont véritablement mondiale à tous de votre programme est le__builtin__
module; tout ce que vous ajoutez à ce module est disponible dans tous les espaces de noms partout.- Hmm, bien plus, non pas que j'en aurais besoin en ce moment, mais peut-être un jour... Merci 🙂
Vous devez vous connecter pour publier un commentaire.
Python donne au programmeur un grand nombre d'outils pour l'introspection de l'environnement en cours d'exécution.
globals()
est juste un de ceux, et il peut être très utile dans une session de débogage pour voir ce que les objets de la portée mondiale contient en fait.Le raisonnement derrière elle, je suis sûr, c'est le même que celui de l'aide
locals()
pour voir les variables définies dans une fonction, ou à l'aide dedir
pour voir le contenu d'un module, ou les attributs d'un objet.À venir à partir d'un C++ fond, je peux comprendre que ces choses semblent inutiles. Dans un liés statiquement typé statiquement environnement, ils doivent absolument l'être. Dans ce cas, il est connu au moment de la compilation exactement ce que les variables sont globales, et ce que les membres d'un objet, et même ce que les noms sont exportées par une autre unité de compilation.
Dans un langage dynamique, cependant, ces choses ne sont pas fixes; elles peuvent changer en fonction de la façon dont le code est importé, ou même lors de l'exécution. Pour cette raison au moins, d'avoir accès à ce genre d'information dans un débogueur peut être d'une valeur inestimable.
globals
peut être modifié (probablement une capacité préférable de laisser aux experts). Aussi est la pertinence de cette citation de Plongez Dans Python "à l'Aide de lalocals
etglobals
fonctions, vous pouvez obtenir la valeur de l'arbitraire des variables dynamiquement, en fournissant le nom de la variable une chaîne de caractères. Cela reflète la fonctionnalité de lagetattr
fonction, ce qui vous permet d'accéder à des fonctions arbitraires de façon dynamique en fournissant le nom de la fonction comme une chaîne de caractères."Il est également utile lorsque vous avez besoin d'appeler une fonction à l'aide de la fonction nom de la chaîne. Par exemple:
def foo(*args): print("hw", *args)
que vous pouvez faire:globals()['foo']()
ouglobals()['foo']('reason', 42)
etc.Vous pouvez transmettre le résultat de
globals()
etlocals()
à laeval
,execfile
et__import__
commandes. Il en résulte la création d'un environnement restreint pour les commandes de travail.Ainsi, ces fonctions existent pour soutenir d'autres fonctions qui bénéficient d'un environnement potentiellement différent du contexte actuel. Vous pourriez, par exemple, appeler
globals()
puis supprimer ou ajouter des variables avant d'appeler l'une de ces fonctions.globals()
est utile poureval()
-- si vous voulez évaluer un code qui fait référence à des variables dans la portée, ces variables seront soit dans des variables globales ou locales.À développer un peu plus, le
eval()
builtin fonction interpréter une chaîne de code Python qui lui est donné. La signature est:eval(codeString, globals, locals)
, et vous pouvez l'utiliser comme ceci:Cela fonctionne, parce que l'interprète obtient la valeur de
x
de lalocals()
dict de variables. Bien sûr, vous pouvez fournir votre propre dict de variables à eval.eval("x+1")
fait la même chose, en raison de ses paramètres par défaut; voirhelp(eval)
globals()
peut être utilisé: stackoverflow.com/a/22021058/9024698.Il peut être utile dans 'déclarative python'. Par exemple, dans le ci-dessous
FooDef
etBarDef
sont des classes utilisées pour définir une série de structures de données qui sont ensuite utilisés par un paquet en entrée, ou sa configuration. Cela vous permet beaucoup de souplesse dans vos commentaires, et vous n'avez pas besoin d'écrire un analyseur syntaxique.Noter que ce fichier de configuration utilise une boucle pour créer une liste de noms qui font partie de la configuration de
Foo_other
. Ainsi, cette configuration de la langue vient avec un très puissant "préprocesseur", avec une disposition des la bibliothèque run-time. Dans le cas où vous voulez, dire, trouver un ensemble de journal, ou un extrait de choses à partir d'un fichier zip et base64 les décoder, dans le cadre de la génération de votre configuration (cette approche n'est pas recommandée, bien sûr, pour les cas où l'entrée peut être à partir d'une source non fiable...)Le package lit la configuration à l'aide de quelque chose comme ce qui suit:
Donc, finalement, arriver à ce point,
globals()
est utile, lors de l'utilisation d'un tel paquet, si vous voulez à la menthe et une série de définitions de la procédure:C'est l'équivalent de l'écriture
Un exemple de ce package, qui obtient son entrée par la collecte d'un tas de définitions à partir d'un module python est PLY (Python-lex-yacc) http://www.dabeaz.com/ply/ - dans ce cas, les objets sont pour la plupart des objets de fonction, mais les métadonnées à partir de la fonction des objets (leurs noms, docstrings, et de l'ordre de définition) fait aussi partie de l'entrée. C'est pas un bon exemple pour l'utilisation de
globals()
. Aussi, il est importé par la 'configuration' - une normale script python -- plutôt que l'inverse.J'ai utilisé le "déclaratif python" sur quelques projets sur lesquels j'ai travaillé, et ont eu l'occasion d'utiliser
globals()
lors de l'écriture des configurations pour ceux. Vous pourriez certainement faire valoir que cela était dû à une faiblesse dans la façon dont la configuration "langue" a été conçu. L'utilisation deglobals()
de cette façon, ne produit pas très clair résultats; seulement les résultats qui pourraient être plus faciles à entretenir que d'écrire une douzaine de près identiques consolidés.Vous pouvez également l'utiliser pour donner de l'importance des variables dans le fichier de configuration, en fonction de leurs noms:
Cette méthode pourrait être utile pour tout module python qui définit un lot de tables et des structures, pour la rendre plus facile d'ajouter des éléments de données, sans avoir à maintenir les références ainsi.
Il peut également être utilisé pour obtenir une instance de la classe 'classname' partir d'une
chaîne: