Utilisation de variables dans le gestionnaire de signal - besoin global?
J'ai un gestionnaire de signal pour traiter ctrl-c interrompre. Si dans le gestionnaire de signal je veux lire une variable définie dans mon script principal, est-il une alternative à l'utilisation d'un "global" instruction lors de la définition de la variable?
Je ne me dérange pas de le faire, mais lire ce post (Utilisez-vous le "global" instruction en Python?) dans laquelle quelqu'un a fait remarquer qu'il devrait y avoir aucune raison de jamais utiliser mondiale.
Quelle est l'alternative dans ce cas?
Mon code ressemble à ceci:
def signal_handler(signal, frame):
print "in sig handler - g_var=%s" % g_var
def main():
global g_var
g_var = "test"
time.sleep(120)
if __name__ == '__main__':
signal.signal(signal.SIGINT, signal_handler)
main()
OriginalL'auteur Joe Watkins | 2012-09-11
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser une fermeture comme le gestionnaire de signal qui acquiert l'état dans le script principal:
Je ne crois pas avoir une bonne raison est généralement pourquoi les variables globales peuvent être déplacés vers un cadre plus restreint! 🙂
La modification d'une variable à partir de l'extérieur de la portée ne fonctionne pas comme on pourrait s'y attendre. Une solution de contournement consiste à passer une référence, comme un dictionnaire qui contient une référence à la variable à modifier.
ou en python3 utilisation
nonlocal
.OriginalL'auteur Henry Gomersall
Vous pouvez utiliser
partial
pour créer une "fermeture".OriginalL'auteur Ale
Dans le paradigme orienté objet (POO) c'est très pratique pour utiliser les lambdas. À l'aide de lambda vous pourriez passer un certain contexte supplémentaire (comme un auto de référence) et/ou de se débarrasser de la fraction inutilisée des arguments (signal, cadre).
OriginalL'auteur Maxim Ky
Vous pouvez accéder à l'extérieur de la portée des variables à partir de l'intérieur d'une ligne définie par la fonction, comme suit:
OriginalL'auteur John Fink
Si vous êtes simplement à la lecture de la variable, il devrait y avoir aucun besoin de faire de la variable "globale"
global est nécessaire pour vous permettre de modifier la variable et que ce changement se propager dans le module de l'espace de noms.
Si vous souhaitez passer de l'état de votre rappel sans l'aide de global, la méthode classique pour ce faire, nous utilisons une méthode d'instance comme le rappel:
OriginalL'auteur mgilson