Seite 2 von 2

Re: TypeError: unsupported operand type(s)

Verfasst: Sonntag 20. Oktober 2024, 13:41
von DeaD_EyE
Wie viele Tage hat ein Monat? Wie viele Tage hat ein Jahr? Wie viele Tage hat ein Schaltjahr? Kann ich eine Zeitspanne in Monaten korrekt angeben, dass jeder sagen kann, dass es exakt x Sekunden sind? Wenn ich eine Zeitspanne in Monaten angebe, aber der Startzeitpunkt unbekannt ist, woher weiß ich dann, wie viele Tage das sind?

Re: TypeError: unsupported operand type(s)

Verfasst: Sonntag 20. Oktober 2024, 17:09
von Master_Shredder
Warum hast du in der Klasse `berechne = berechnung` geschrieben?
@narpfel Ja mit Namensgebungen habe ich es nicht so. Heißt jetzt "berechnung = berechnung"
`berechnungen.berechnung` ist immer noch eine Verschachtelung zu viel.
Ja kommt mir auch so vor. Gerade auch weil diese beiden Module im gleichen Package liegen. Aber einfach "import berechnung" geht nicht
Dann kommt:

Code: Alles auswählen

Traceback (most recent call last):
  File "/home/masterblack/PycharmProjects/Verbrauchsrechner/verbrauchsrechner.py", line 5, in <module>
    from berechnungen.abrechnung import Abrechnung
  File "/home/masterblack/PycharmProjects/Verbrauchsrechner/berechnungen/abrechnung.py", line 8, in <module>
    import berechnung
ModuleNotFoundError: No module named 'berechnung'
Man muss nicht jedes Zwischenergebnis an einen Namen binden.
Ja ich weiß, aber ich habe in Bezug auf clean code gelesen, dass ein return(glaube hies) keine Operation sondern immer eine einzige Variable zurückgeben sollte.
Und bitte unbedingt `--strict` für mypy benutzen, deine Typannotationen sind immer noch kaputt.
Bin ich dabei muss ich noch durchsehen.
Wie viele Tage hat ein Monat? Wie viele Tage hat ein Jahr?
@DeaD_EyE Ich weiß was gemeint ist aber so genau brauche ich es hier jetzt nicht.

Re: TypeError: unsupported operand type(s)

Verfasst: Sonntag 20. Oktober 2024, 17:24
von Dennis89
Hallo,

es ist egal ob du schreibst:

Code: Alles auswählen

@property
def gesamtbetrag_netto(self) -> float:
    betrag = self.arbeitspreis_netto + self.grundpreis_tagesgenau_netto
    return betrag
oder

Code: Alles auswählen

@property
def gesamtbetrag_netto(self) -> float:
    return self.arbeitspreis_netto + self.grundpreis_tagesgenau_netto
    
Return gibt jeweils das Ergebnis der Rechnung zurück und nichts anderes. Bei deinem Code wird das Ergebnis an einen Namen gebunden und im zweiten wird dieser Schritt übersprungen und das Ergebnis gleich zurück gegeben. Also es wird in diesem Beispiel immer nur *ein Wert* zurück gegeben und nie eine Operation.

Ich weis nicht in welchen Worten "clean code" genau definiert ist. Aber ich könnte mir vorstellen, das "unnötige" Namen nicht dazu gehören.

Grüße
Dennis

Re: TypeError: unsupported operand type(s)

Verfasst: Sonntag 20. Oktober 2024, 17:49
von __blackjack__
Alles aus den beiden Code-Blöcken lässt sich auf drei Funktionen vereinfachen:

Code: Alles auswählen

from datetime import datetime


def vergangene_tage_ermitteln(anfangsdatum, enddatum=None):
    return (enddatum - anfangsdatum).total_seconds() / (60 * 60 * 24)


def gesamtbetrag_brutto(tarif):
    gesamtbetrag_netto = tarif.arbeitspreis_netto + round(
        (tarif.arbeitspreis_netto * 12 / 365)
        * vergangene_tage_ermitteln(datetime(2024, 6, 13)),
        3,
    )
    return (
        gesamtbetrag_netto
        + gesamtbetrag_netto * tarif.mehrwertsteuersatz / 100
    )


def bisheriger_gezahlter_abschlag(tarif):
    return (
        vergangene_tage_ermitteln(datetime(2024, 6, 1))
        // 28
        * tarif.monatlicher_abschlag
    )
Mehr macht der gezeigte Code letztlich nicht. Und das waren mal zwei Klassen in zwei Modulen die jeweils auch noch in einem Package stecken. 😱

Re: TypeError: unsupported operand type(s)

Verfasst: Mittwoch 23. Oktober 2024, 11:23
von Master_Shredder
@__blackjack__ also ich muss ehrlich sagen, dies hier verstehe ich nicht so ganz :geek: . Aber ich werde es mir mal merken. Ansonsten lasse ich es jetzt mal so wie ich es habe. Bis ich etwas mehr verstehe.
Danke an @all.

Tschü Shredder

Re: TypeError: unsupported operand type(s)

Verfasst: Mittwoch 23. Oktober 2024, 11:33
von __blackjack__
@Master_Shredder: Na ich habe den Code genommen aus den beiden Modulen und habe statt Aufrufe/Property-Zugriffe in den einzelnen Funktionen/Methoden zu machen, einfach alles was nur *einmal* irgendwo anders verwendet wurde, direkt reingeschrieben. Eine Funktion ist zum Property `Tarif.arbeitspreis_netto` geworden, weil die nur mit Attributen von `Tarif` gearbeitet hat. Und aus der Zeitspannenfunktion habe ich das unschöne "Tage"/"Monate"-Argument rausgenommen, was a) die Funktion vereinfacht, und b) sieht man jetzt deutlich dass ein Monat in der Rechnung 28 Tage hat, weil an der entsprechenden Stelle die Tage durch 28 geteilt werden. An 2419200 sieht man das ja nicht so wirklich direkt, dass das 28 Tage sind. 🙂

Re: TypeError: unsupported operand type(s)

Verfasst: Mittwoch 23. Oktober 2024, 12:14
von DeaD_EyE
Sirius3 hat geschrieben: Samstag 19. Oktober 2024, 16:14 @narpfel: bei Sprachen, die Ducktyping unterstützen sind Typannotation per Definition kaputt.
Ich nutze die TypenAnnotationen exzessiv, da mir die IDE dann die richtigen Vorschläge macht.