Verwenden von Variablen im Signalhandler – erfordern globale?

Ich habe einen Signalhandler, um den Ctrl-C-Interrupt zu behandeln. Wenn ich im Signal-Handler eine Variable in meinem Haupt-Skript lesen möchte, gibt es eine Alternative zur Verwendung einer "globalen" Anweisung bei der Einstellung der Variablen?

Ich habe nichts dagegen, dies zu tun, aber lesen Sie diesen Beitrag ( Verwenden Sie die "globale" Aussage in Python? ), In der jemand kommentiert, dass es keinen Grund geben sollte, jemals global zu nutzen.

Was ist die Alternative in diesem Fall?

Mein Code sieht so aus:

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() 

4 Solutions collect form web for “Verwenden von Variablen im Signalhandler – erfordern globale?”

Sie können eine Schließung als Signalhandler verwenden, der seinen Zustand aus dem Hauptskript erwirbt:

 import signal import sys import time def main_function(): data_for_signal_handler = 10 def signal_handler(*args): print data_for_signal_handler sys.exit() signal.signal(signal.SIGINT, signal_handler) # Or whatever signal while True: data_for_signal_handler += 1 time.sleep(0.5) if __name__ == '__main__': main_function() 

Sie können partial , um eine "Schließung" zu erstellen.

 import signal from functools import partial def signal_handler(g_var, signal, frame): print "in sig handler - g_var=%s" % g_var def main(): g_var = "test" signal.signal(signal.SIGINT, partial(signal_handler, g_var)) time.sleep(120) if __name__ == '__main__': main() 

Sie können innerhalb von Inline-definierten Funktionen auf externe Variablen zugreifen, so wie:

 my_values = {'foo':'bar'} def handler(signum, frame): for key,val in my_values.items(): print key,val my_values['bat']='baz' #remember to use mutable types, like dicts or lists signal.signal(signal.SIGINT, handler) 

Wenn Sie gerade die Variable lesen, sollte es keine Notwendigkeit geben, die Variable "global" zu machen

 def foo(): print a a = 3 foo() #3 

Global ist notwendig, damit Sie die Variable ändern und diese Änderung in den Modul-Namespace übertragen können.

Wenn Sie einen Zustand an Ihren Rückruf übergeben wollen, ohne global zu sein, ist der typische Weg, dies zu tun, um eine Instanzmethode als Rückruf zu verwenden:

 class foo(object): def __init__(self,arg): self.arg = arg def callback_print_arg(self): print self.arg def call_callback(callback): callback() a = foo(42) call_callback(a.callback_print_arg) #42 
Python ist die beste Programmiersprache der Welt.