NameError uebreschreiben

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Costi
User
Beiträge: 545
Registriert: Donnerstag 17. August 2006, 14:21

bei einer undefinierten variable soll erstmal kein NameError geraist werden, sondern eine andere quelle (ausser dem namespace) nach der variable gefragt werden.
wie implementiere ich sowas?

danke
cp != mv
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

So zum Beispiel:

Code: Alles auswählen

try:
    var = unknown
except NameError:
    var = somewhere.var
Costi
User
Beiträge: 545
Registriert: Donnerstag 17. August 2006, 14:21

ups,
hab vergessen zu sagem dass dies mit JEDER variable geschehen soll

und ich habe keine lust fuer alle variablen eine try-except klausel zu schreiben :lol:
cp != mv
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Gib doch mal ein wenig Kontext an, denn auf NameErrors auf Grund von nicht vorhandenen Variablen ist kein guter Stil. Wahrscheinlich benötigst du einfach nur eine geeignetere Datenstruktur.
Costi
User
Beiträge: 545
Registriert: Donnerstag 17. August 2006, 14:21

man soll eine variable, die in einem prozess ist auf einem anderen prozess uebrtragen koennen


hier etwas pseudo code

Code: Alles auswählen

def on_name_error(varname):
    mysocket.send('GIMMI: ' + varname)
    resp = mysocket.recv(1024*5)
    return marshal.loads(resp)

und dann:

Code: Alles auswählen

if os.fork():
    enable_server()
    myvar = 2
else:
    sleep(1)
    enable_client()
    print myvar
cp != mv
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Kapsel es in eine Klasse und schreib dir dort nen getter.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Lokale und globale Variablen werden intern in dict-Objekten gespeichert. Da kann man auch eigene dict-artige Objekte benutzen, die sich anders verhalten. Dort wo `return 42` steht, könntest auch IPC stattfinden.

Code: Alles auswählen

class d(dict):
    def __getitem__(self, name):
        try: return dict.__getitem__(self, name)
        except KeyError: return 42 

exec "print a + b" in d(a=3)
Stefan
Antworten