Django und Klassenvariablen

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Benutzeravatar
TheGrudge
User
Beiträge: 96
Registriert: Donnerstag 4. Mai 2006, 18:39

Nein das geht leider nicht und wird auch von den Django-Entwicklern nicht empfohlen, da in der __init__ soviel Magic passiert das es dann nicht mehr geht.
Benutzeravatar
TheGrudge
User
Beiträge: 96
Registriert: Donnerstag 4. Mai 2006, 18:39

Jetzt habe ich nochmal was probiert und kapiere mal wieder nicht was das sein soll.

Code: Alles auswählen

def __get_uptime(self):
        """return uptime in a human readable format"""
        if not tmp:
            return "00:00:00"
        div, mod = divmod(tmp, 8640000)
        div, mod = divmod(mod, 360000)
        uptime_str = '%d:' % div
        div, mod = divmod(mod, 6000)
        uptime_str += '%02d:' % div
        div, mod = divmod(mod, 100)
        uptime_str += '%02d' % div
        return uptime_str
uptime = property(__get_uptime)
Ich habe nun tmp einfach mal weggelassen, damit ich mal testen kann was passiert wenn der Benutzer eigentlich nicht eingewählt ist. Sollte ja funktionieren, aber es kommt:

Code: Alles auswählen

    146 #        tmp = int(snmp_val(_defaultcfg.ip, _defaultcfg.snmp_community,
    147 #                _defaultcfg.uptime_mib.oid + str(self.cur_id) + ".0", 1))
--> 148         if not tmp:
    149             return "00:00:00"
    150         div, mod = divmod(tmp, 8640000)

<type 'exceptions.NameError'>: global name 'tmp' is not defined
Wieso sucht er denn nach einer globalen tmp? Ich kann doch sonst auch einfach sagen, gucke ob Variable da (if tmp) und dann sagt Python immer False falls nicht vorhanden. Liegt das daran das es als Property zugewiesen wurde?
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

TheGrudge hat geschrieben:Nein das geht leider nicht und wird auch von den Django-Entwicklern nicht empfohlen, da in der __init__ soviel Magic passiert das es dann nicht mehr geht.
Hm. Da ist wohl "removing magic" noch nicht so ganz durchgedrungen :?

Wie wäre es mit __new__?
TheGrudge hat geschrieben:Ich kann doch sonst auch einfach sagen, gucke ob Variable da (if tmp) und dann sagt Python immer False falls nicht vorhanden.
Kannst du nicht. Es kommt ein NameError.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
TheGrudge
User
Beiträge: 96
Registriert: Donnerstag 4. Mai 2006, 18:39

Ist das neu in Python2.5? Ich dachte immer früher ging das, ich bin mir fast sicher das ich das damals so gelöst habe.
Naja dann initialisiere ich die Variable einfach mit 0, ist ja nicht schlimm.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

IMHO ging das noch nie ;)

Mach mal ein mini Skript und starte es:

Code: Alles auswählen

if tmp: pass
Wenn tmp vorher nicht initialisiert wurde erhälst du:
NameError: name 'tmp' is not defined
Man könnte das vielleicht so machen:

Code: Alles auswählen

if "tmp" in locals(): pass
Nachsehen ob tmp im lokalen Namensraum ist...

Also so:

Code: Alles auswählen

#~ tmp = True
if locals().get("tmp", None):
    print "OK"

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
TheGrudge
User
Beiträge: 96
Registriert: Donnerstag 4. Mai 2006, 18:39

Jaja ich bin irgendwie nicht ganz dabei im Moment... :lol:
Natürlich ging es noch nie, ich habe es ja immer so getestet:

Code: Alles auswählen

tmp = irgendwas()
if tmp:
    mach_das_hier()
Dadurch wird ja tmp zugewiesen, im "schlimmsten Fall" mit None und dadurch existiert sie. Oh man...
BlackJack

Vielleicht solltest Du einfach in das *Model* nicht zuviel Logik reinstecken wollen. Ich würde solche Objekte die an einem ORM hängen eher als Datenobjekte betrachten und die Arbeit in einen Controller verlegen. Insbesondere wenn man bei den Model-Objekten so leicht in Konflikt mit der "Magie" des Frameworks in Konflikt gerät.

http://de.wikipedia.org/wiki/MVC
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

TheGrudge hat geschrieben:Nochmal eine Frage, wenn ich den Code mit hasattr ausstatte, dann funktioniert das nicht. Kann es sein das man hasattr nicht mit self benutzen kann?
Doch. Aber nicht mit mangled Names:

__foo wird zu _ClassName__foo. Und das muss man mit getattr/hasattr manuell schreiben.
TUFKAB – the user formerly known as blackbird
Antworten