Seite 1 von 2

Verfasst: Donnerstag 10. Mai 2007, 23:28
von joost
Eben nicht, weil diese Funktionen nichts tun - und schon gar keine Formatierung.

Verfasst: Donnerstag 10. Mai 2007, 23:38
von TheGrudge
Wieso formatiert die Funktion nichts??
Der Wert kommt per SNMP in einem komischen Zeitformat das ich umwandle, verstehe deinen Punkt nicht.

Verfasst: Donnerstag 10. Mai 2007, 23:48
von joost
Sorry, dabei war ich noch bei Deinem zum 22.26 geposteten Code.

Verfasst: Freitag 11. Mai 2007, 08:17
von TheGrudge
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?

Verfasst: Freitag 11. Mai 2007, 08:28
von jens
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...

Verfasst: Freitag 11. Mai 2007, 08:31
von TheGrudge
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.

Verfasst: Freitag 11. Mai 2007, 08:40
von TheGrudge
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?

Verfasst: Freitag 11. Mai 2007, 08:40
von jens
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.

Verfasst: Freitag 11. Mai 2007, 08:49
von TheGrudge
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.

Verfasst: Freitag 11. Mai 2007, 08:57
von jens
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"

Verfasst: Freitag 11. Mai 2007, 09:00
von TheGrudge
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...

Verfasst: Freitag 11. Mai 2007, 10:10
von 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

Verfasst: Freitag 11. Mai 2007, 15:22
von mitsuhiko
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.