Django und Klassenvariablen

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
joost
gelöscht
Beiträge: 134
Registriert: Sonntag 29. April 2007, 13:28

Donnerstag 10. Mai 2007, 23:28

Eben nicht, weil diese Funktionen nichts tun - und schon gar keine Formatierung.
[color=green][size=75]Never use idle.pyw, if you need sys.stdin[/size][/color]
Benutzeravatar
TheGrudge
User
Beiträge: 91
Registriert: Donnerstag 4. Mai 2006, 18:39

Donnerstag 10. Mai 2007, 23:38

Wieso formatiert die Funktion nichts??
Der Wert kommt per SNMP in einem komischen Zeitformat das ich umwandle, verstehe deinen Punkt nicht.
joost
gelöscht
Beiträge: 134
Registriert: Sonntag 29. April 2007, 13:28

Donnerstag 10. Mai 2007, 23:48

Sorry, dabei war ich noch bei Deinem zum 22.26 geposteten Code.
[color=green][size=75]Never use idle.pyw, if you need sys.stdin[/size][/color]
Benutzeravatar
TheGrudge
User
Beiträge: 91
Registriert: Donnerstag 4. Mai 2006, 18:39

Freitag 11. Mai 2007, 08:17

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?

Code: Alles auswählen

def __get_uptime(self):
        """return uptime in a human readable format"""
        if hasattr(self, '__uptime'):
            print "old value..."
            return self.__uptime
        print "No uptime defined, getting new one..."
        tmp = int(snmp_val(_defaultcfg.ip, _defaultcfg.snmp_community,
                _defaultcfg.uptime_mib.oid + str(self.cur_id) + ".0", 1))
        if not tmp:
            self.__uptime = "00:00:00"
        else:
            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
            self.__uptime = uptime_str
        return self.__uptime
    uptime = property(__get_uptime)
Die Testausgabe lautet immer:

Code: Alles auswählen

In [7]: a.uptime
No uptime defined, getting new one...
No uptime defined, getting new one...
Out[7]: '10:17:36'

In [8]: a.uptime
No uptime defined, getting new one...
No uptime defined, getting new one...
Out[8]: '10:17:36'
Er sollte beim zweiten Mal ja "Old value..." hinschreiben, oder etwa nicht?
Und warum schreibt er die Ausgabe immer 2 mal hin?
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Freitag 11. Mai 2007, 08:28

TheGrudge hat geschrieben:

Code: Alles auswählen

def __init__(self, uptime=0):
    self.uptime = uptime
Ich würde sagen, das ist schon die richtige Lösung. Nur must du mit args und kwargs arbeiten und die eigentliche __init__ Methode mit super() aufrufen. Dann sollte das gehen, denke ich...

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
TheGrudge
User
Beiträge: 91
Registriert: Donnerstag 4. Mai 2006, 18:39

Freitag 11. Mai 2007, 08:31

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: 91
Registriert: Donnerstag 4. Mai 2006, 18:39

Freitag 11. Mai 2007, 08:40

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
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Freitag 11. Mai 2007, 08:40

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.

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
TheGrudge
User
Beiträge: 91
Registriert: Donnerstag 4. Mai 2006, 18:39

Freitag 11. Mai 2007, 08:49

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
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Freitag 11. Mai 2007, 08:57

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"

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
TheGrudge
User
Beiträge: 91
Registriert: Donnerstag 4. Mai 2006, 18:39

Freitag 11. Mai 2007, 09:00

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

Freitag 11. Mai 2007, 10:10

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:

Freitag 11. Mai 2007, 15:22

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