Variable vorbelegen

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.
Benutzeravatar
snafu
User
Beiträge: 6908
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@pixewakb: Was spricht denn jetzt gegen den Einsatz von `@property` bzw `@cached_property`?
Benutzeravatar
pixewakb
User
Beiträge: 1413
Registriert: Sonntag 24. April 2011, 19:43

Ich werde mir die Lösung, also den Vorschlag ansehen.

Wenn du eine ganz ehrliche Antwort haben magst: das Abstraktionslevel. Einen "Schalter" kann ich mir gut vorstellen; property und cached_property ist mir nicht eingängig. Das ist kein Argument gegen die Lösung.

Es wird noch was dauern, bis ich die Lösung mal eingeben kann. Im Augenblick habe ich viele Baustellen...
BlackJack

@pixewakb: Also das Abstraktionslevel bei `property()` ist doch sehr überschaubar. Wenn man Getter/Settermethoden verstanden hat, dann ist das doch bloss noch syntaktischer Zucker um solche Methoden in ein ”berechnetes Attribut” umzuwandeln.
BlackJack

@pixewakb: Ich habe das Beispiel noch mal gelesen und es scheint Du brauchst einen anderen Wert als `None` für das vorbelegen weil `None` auch das Ergebnis sein kann. Vielleicht deswegen Deine Fixierung auf `False` die hier alle so ein bisschen irritiert. Das ist deswegen keine gute Idee weil bei einem anderen Wert ja vielleicht auch `False` ein legitimes Ergebnis sein könnte, und damit hast Du dann wieder das gleiche Problem. Für solche Fälle führt man einfach einen garantiert einmaligen, sonst für nichts anderes verwendeten Wert ein gegen den man prüfen kann. Dein Beispiel könnte dann so aussehen:

Code: Alles auswählen

NOT_YET_EVALUATED = object()


class Datenset(object):
 
    def __init__(self, url):
        self.html = self.seite_laden(url)
        self._messdaten_a = NOT_YET_EVALUATED
 
       
    def get_messdaten_a(self):
 
        if self._messdaten_a is NOT_YET_EVALUATED:
            # Wenn die Seite noch nicht
            # ausgewertet wurde, dann
            # erledige das
            try:
                self._messdaten_a = self.auswerten(self.html)
            # Wenn das Objekt keine Messdaten a
            # besitzt, dann None
            except:  # FIXME Konkrete Ausnahmen angeben.
                self._messdaten_a = None
           
        return self._messdaten_a
Ich habe hier das Attribut mal als Implementierungsdetail gekennzeichnet weil es ja problematisch sein kann darauf direkt zuzugreifen.

Und jetzt machen wird daraus mal ein Property, so dass man einfach auf `datenset.messergebnis_a` zugreifen kann und nicht selbst explizit eine `get_*()`-Methode aufrufen muss. Die einzigen beiden, winzigen Änderungen sind das man die Getter-Methode mit ``@property`` dekoriert und die Methode so umbenennt das sie wie das berechnete Attribut heisst das man damit erstellen möchte:

Code: Alles auswählen

NOT_YET_EVALUATED = object()


class Datenset(object):
 
    def __init__(self, url):
        self.html = self.seite_laden(url)
        self._messdaten_a = NOT_YET_EVALUATED
 
    @property
    def messdaten_a(self):
 
        if self._messdaten_a is NOT_YET_EVALUATED:
            # Wenn die Seite noch nicht
            # ausgewertet wurde, dann
            # erledige das
            try:
                self._messdaten_a = self.auswerten(self.html)
            # Wenn das Objekt keine Messdaten a
            # besitzt, dann None
            except:  # FIXME Konkrete Ausnahmen angeben.
                self._messdaten_a = None
           
        return self._messdaten_a
Antworten