TypeError: unsupported operand type(s)

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
DeaD_EyE
User
Beiträge: 1222
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

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?
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Master_Shredder
User
Beiträge: 40
Registriert: Freitag 2. Februar 2024, 18:25

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.
Benutzeravatar
Dennis89
User
Beiträge: 1517
Registriert: Freitag 11. Dezember 2020, 15:13

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
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
__blackjack__
User
Beiträge: 14000
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

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. 😱
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
Master_Shredder
User
Beiträge: 40
Registriert: Freitag 2. Februar 2024, 18:25

@__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
Benutzeravatar
__blackjack__
User
Beiträge: 14000
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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. 🙂
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
Benutzeravatar
DeaD_EyE
User
Beiträge: 1222
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

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.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Antworten