Strings als Variablennamen hernehmen und auf "None"

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
Thrud
User
Beiträge: 3
Registriert: Montag 30. Juli 2007, 13:56

Hallo

Ich bin Python-Neuling und rätsele hier etwas rum. Alles Googeln vergrößert nur meine Verwirrung, vor allem, weil ich vermutlich sowieso längst in ganz abwegige Richtungen denke.

Ich habe einen Text, auf dem ich verschiedene re.search() ausführe.

Das sieht zum Beispiel so aus:

Code: Alles auswählen

    mo = re.search("(?:From|Absender):\s?(.*)", line)
    if mo is not None:
        frmshort = mo.group(1)
        frmfull = mo.group()
        count += 1
        continue
Das ganze läuft in einer Schleife, die zeilenweise über den Text iteriert. Nämlich so:

Code: Alles auswählen

for line in email.Iterators.body_line_iterator(posting, decode = True):
(Nebenbei habe ich da ohnehin etwas Verwunderung gehabt, weil ich aus der RegExp "^" entfernen mußte; irgendwie matchte das nur, wenn es ganz am Anfang im Mailbody stand, am Anfang in der Zeile reichte nicht, trotz zeilenweise Iteration -- das kapiere ich so gar nicht, aber nun gut)

Davon gibts eine ganze Reihe von RegExp-Suchen, womit ich die *short und *full-Variablen befülle.

Nun habe ich eine ganze Reihe solcher Variablen, manche befüllt, manche "None".

Ich möchte herausfinden, welche "None" sind (zu denen soll eine Rückmeldung an den Benutzer erfolgen). Offenbar scheint das kanonisch per Exception gemacht zu werden? Finde ich ja höchst unschön...

Außerdem möchte ich eben nicht jede Variable einzeln im Code abarbeiten, sondern einmal die Variablennamen als String in eine Liste packen. Oder so ähnlich.

Also etwas wie

Code: Alles auswählen

for elem in ('frmfull', 'midfull', ...)
     checke elem
Tja, nur wie?

Ich dachte so an getattr, aber hatte bislang null Erfolg damit. Mir fehlt einfach das Modul oder Objekt, in dem gesucht werden könnte.

Dinge wie "getattr(globals(), 'frmfull')" funktionieren eben auch nicht. Ebensowenig, wenn ich statt "globals()" den Namen meiner Quelldatei (ohne ".py" angebe -- das ist doch der Modulname?).

Long story short: ich habe keine Ahnung, wie man so etwas in Python anpackt.

(in Common Lisp wäre das so simpel... aber ist es hier vermutlich auch, wenn man nur weiß wie)
BlackJack

Stecke die "Variablen" doch einfach in ein Dictionary. Da kann man sie per Namen reinstecken und auch wieder herausholen.

Das mit '^' ist in der Tat komisch. Gib doch mal die Zeilen mit `repr()` aus, um zu sehen was *wirklich* enthalten ist.

Was Du mit den Ausnahmen bei Variablen die `None` "sind" meinst, ist mir nicht so ganz klar. Namen existieren oder existieren nicht. Welche die nicht existieren "sind" nicht `None` sondern einfach nicht da und ein Zugriff löst eine Ausnahme aus. Wenn Du willst, dass ein Name existiert, musst Du ihn an ein Objekt binden. Zum Beispiel an `None`, was ein üblicher Platzhalter ist, wenn man "Nichts" an einen Namen binden möchte.
Thrud
User
Beiträge: 3
Registriert: Montag 30. Juli 2007, 13:56

BlackJack hat geschrieben:Stecke die "Variablen" doch einfach in ein Dictionary. Da kann man sie per Namen reinstecken und auch wieder herausholen.
Ah, ein Dictionary. Genau sowas meinte ich mit "in falsche Richtung denken", da bin ich gerade absolut nicht draufgekommen.
BlackJack hat geschrieben: Das mit '^' ist in der Tat komisch. Gib doch mal die Zeilen mit `repr()` aus, um zu sehen was *wirklich* enthalten ist.
Ich guck mal, das ist zwar Nebensache, aber fürs Python-Lernen ist es sicherlich nicht dumm, unerwarteten Dingen auch mal auf den Grund zu gehen.
BlackJack hat geschrieben: Was Du mit den Ausnahmen bei Variablen die `None` "sind" meinst, ist mir nicht so ganz klar. Namen existieren oder existieren nicht. Welche die nicht existieren "sind" nicht `None` sondern einfach nicht da und ein Zugriff löst eine Ausnahme aus. Wenn Du willst, dass ein Name existiert, musst Du ihn an ein Objekt binden. Zum Beispiel an `None`, was ein üblicher Platzhalter ist, wenn man "Nichts" an einen Namen binden möchte.
Ja, ich glaube, ich habe "None" und "nicht existent" verwechselt.

Auf "None" (das kommt ja bei re.search() als Match-Objekt raus, wenn es keinen Treffer gab) kann ich dann wohl einfach mit "if mo is not None" testen?

Danke für die Tipps, ich kann sie leider nicht gleich ausprobieren, sondern erst heute abend oder morgen früh.
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Thrud hat geschrieben:) kann ich dann wohl einfach mit "if mo is not None" testen?

Da reicht "if mo:" (Wenn nicht None ist derWahrhitswert True) oder für den umgekehrten Fall "if mo is None:"
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Zap hat geschrieben:Da reicht "if mo:" (Wenn nicht None ist derWahrhitswert True) oder für den umgekehrten Fall "if mo is None:"
Nicht zwingend. bool("") ist auch False, daher würde

Code: Alles auswählen

mo = ""
if mo:
  print "Hallo"
nichts ausgeben
Thrud
User
Beiträge: 3
Registriert: Montag 30. Juli 2007, 13:56

Thrud hat geschrieben:Hallo

Ich bin Python-Neuling und rätsele hier etwas rum. Alles Googeln vergrößert nur meine Verwirrung, vor allem, weil ich vermutlich sowieso längst in ganz abwegige Richtungen denke.
So, heute kam mein "Core Python Programming", jetzt stümpere ich nicht mehr planlos herum, sondern lese da erstmal ein paar Kapitel.
Antworten