Unerklärliche Ausnahme nach Update auf 2.7.1

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
Gremlin
User
Beiträge: 166
Registriert: Freitag 28. Mai 2010, 23:49

Hallo, ich mal wieder.

Ich habe vorhin von Python 2.7 auf 2.7.1 aktualisiert und erhalte nun einen Fehler in meinem Programm, der natürlich vorher nicht da war.
Ein Fehler an sich wäre ja kein Problem, wenn ich ihn nachvollziehen könnte, aber das hier übersteigt meine Vorstellungskraft etwas:

Ich habe ein Dictionary, dieses wird gepickled in einem mit base64 und AES verschlüsselten String über das Netzwerk übertragen.
Das Dictionary enthält, unter anderem, einen String welcher Python Quellcode repräsentiert:

Code: Alles auswählen

b"""from __future__ import unicode_literals
import wx
import wc

def main(thread, panel, mod, path, info, callable=None, args=(), kwargs={}):
    wc.show_dialog(panel, path)
    if callable is not None:
        wx.CallAfter(callable, *args, **kwargs)"""
Diesen String wandle ich in ein Modul um, wie es von sma hier beschrieben wurde und führe die Funktion main() in einem Thread aus. (Die Umwandlung geschieht auch im Thread.) Das hat bis Python 2.7 auch wunderbar funktioniert.

Mit dem Update auf 2.7.1 jedoch, erhalte ich folgenden Fehler:
File: "<string>", line 8, in main
AttributeError: 'NoneType' object has no attribute 'CallAfter'
Diesen Fehler habe ich auch mit jedem anderen "Namen" der nach Zeile 8 verwendet wird. Ja, Zeile 8, vor dieser Zeile geht alles seinen gewohnten Gang, aber ab dieser Zeile, verweist jeder Name auf "None"! Und dabei ist es unwichtig ob Zeile 8 die letzte Zeile ist.

Ich versteh es nicht. :(
Tut es jemand anderes?
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Wenn dein Objekt ein NoneType ist, also "None" ist, dann liegt das bei dir warscheinlich daran das du irgendeine Funktion ausführst und einen Rückgabe Wert fängst. Da diese Funktion kein "return" hat, erhälst du None.
Eine Möglichkeit den Fehler zu behandeln wäreauf None zu prüfen, zB: mit "if obj is None: ..."
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Gremlin
User
Beiträge: 166
Registriert: Freitag 28. Mai 2010, 23:49

Nein Nein, mit 100%iger Wahrscheinlichkeit liegt es nicht an der Logik, das denke darf ich inzwischen bedenkenlos behaupten. :P

Vielleicht eine etwas einfachere Erklärung des Problems:

Code: Alles auswählen

>>> test = 'blub'
>>> test
None
BlackJack

@Gremlin: Da ist wohl beim Update gründlich was schief gelaufen.
Gremlin
User
Beiträge: 166
Registriert: Freitag 28. Mai 2010, 23:49

Naja, das mit dem Interpreter war jetzt nur ein fiktives Beispiel um das Problem zu verdeutlichen. Der Interpreter macht natürlich kein None aus dem 'blub'.
Aber gut, werd ichs halt morgen mit einer Neuinstallation versuchen. :K
BlackJack

@Gremlin: Wenn das kein echter Quelltext mit echtem Ergebnis war, dann war meine Antwort dazu auch nicht "echt". :roll:

Vielleicht funktioniert Dein `exec`-Code auch einfach nicht mehr. Das ist ja schon ein wenig "magisch".
Gremlin
User
Beiträge: 166
Registriert: Freitag 28. Mai 2010, 23:49

BlackJack hat geschrieben:Vielleicht funktioniert Dein `exec`-Code auch einfach nicht mehr. Das ist ja schon ein wenig "magisch".
Vermutlich. Hab nun wieder 2.7. :o
Antworten