es funktioniert, nur: Ist das ok oder kann das Probleme machen?
Code: Alles auswählen
In [21]: 1 + True
Out[21]: 2
Code: Alles auswählen
days += is_leap(date)
mutetella
Code: Alles auswählen
In [21]: 1 + True
Out[21]: 2
Code: Alles auswählen
days += is_leap(date)
Also würdest Du ehernumerix hat geschrieben:... überlegen, inwieweit es die Lesbarkeit des Codes verschlechtert.
Code: Alles auswählen
if is_leap(year):
days += 1
Nö, weil ich ein Freund der Kürze bin ...mutetella hat geschrieben:Also würdest Du ehernumerix hat geschrieben:... überlegen, inwieweit es die Lesbarkeit des Codes verschlechtert.verwenden?Code: Alles auswählen
if is_leap(year): days += 1
Code: Alles auswählen
In [2]: from datetime import datetime as DateTime
In [3]: DateTime.today().strftime('%j')
Out[3]: '293'
Code: Alles auswählen
1 + 1 if is_leap(year) else 0
Nimm den ersten Tag des Folgemonats und ziehe davon einen Tag ab. datetime macht den Rest.mutetella hat geschrieben:@gkuhl:
Ne, mir geht es um Sprünge vom 29. Februar um 1 Jahr vor oder zurück bzw. das Ermitteln des jeweils letzten Tages im Monat. Und dafür muss ich wissen, ob das Zieldatum ein Schaltjahr ist oder nicht.
Das wäre dann alsoPanke hat geschrieben:Nimm den ersten Tag des Folgemonats und ziehe davon einen Tag ab.
Code: Alles auswählen
date.replace(day=1, month=(date.month + 1)
date -= timedelta(1)
Code: Alles auswählen
day = [31, 28 + is_leap(date.year), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][date.month - 1]
date.replace(day=day)
Ich würde es wohl tun.mutetella hat geschrieben:Also würdest Du eherverwenden?Code: Alles auswählen
if is_leap(year): days += 1
Dann erklär' mir doch mal bitte, was calendar.monthrange() anderes macht, als aus einer "per Hand" erstellten Liste die jeweilige Anzahl der Tage pro Monat herauszupicken....EyDu hat geschrieben:Du findest eine per Hand erstellte Liste einfacher als eine gut lesbare und intuitive Lösung?
Code: Alles auswählen
# Constants for months referenced later
January = 1
February = 2
# Number of days per month (except for February in leap years)
mdays = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
def monthrange(year, month):
"""Return weekday (0-6 ~ Mon-Sun) and number of days (28-31) for
year, month."""
if not 1 <= month <= 12:
raise IllegalMonthError(month)
day1 = weekday(year, month, 1)
ndays = mdays[month] + (month == February and isleap(year))
return day1, ndays
def isleap(year):
"""Return 1 for leap years, 0 for non-leap years."""
return year % 4 == 0 and (year % 100 != 0 or year % 400 == 0)
Wenngleich es wohl keine Rolle spielt, muss ich mich hier doch verteidigen. Dass calendar.monthrange() in derselben Weise wie ich vorgeht, habe ich gerade vor 15 Minuten entdeckt, als ich aufgrund von EyDu's Beitrag zu meiner Schande überhaupt erst erfuhr, dass es diese Funktion gibt. Von kopieren kann also keine Rede sein. Vielmehr fühle ich mich dadurch, dass die Autoren des calendar-Moduls in diesem Punkt genauso verfahren, bestätigt.lunar hat geschrieben:..., die Implementierung derselbe in den eigenen Quelltext zu kopieren?! Verzeih mir den Spott, doch ich finde es ziemlich merkwürdig, eine eigene Implementierung mit dem Verweis darauf zu verteidigen, dass die Bibliothek es exakt genauso macht.
Code: Alles auswählen
from calendar import monthrange
Uhm, ja, Klammern eben...lunar hat geschrieben:@Leonidas: Ich wundere mich durchaus, was Du bei dieser Variante machen wolltest, liefert sie doch mithin nicht das erwartete Ergebnis. Die Addition wird nämlich vor dem bedingten Ausdruck ausgewertet, so dass der Ausdruck im Gesamten entweder 2 oder 0 ergibt, aber nicht 1.
Da hab' ich mich gestern vielleicht etwas zu absolut ausgedrückt. Es fehlt mir bei weitem die Erfahrung, aufgrund derer ich sagen könnte, es so oder anderst zu machen. In diesem konkreten Fall habe ich mich einfach sehr darüber gefreut, endlich einmal etwas in einer Art und Weise gelöst zu haben, mit der offensichtlich auch Profis das Problem angegangen sind. Und soetwas lässt man sich natürlich nicht gleich wieder nehmen... calendar.monthrange() nicht zu importieren war also nicht eine Entscheidung besseren Wissens, sondern schlichtweg purer Stolz auf meinen [ironie]genialen Einfall, die jeweilige Tagesanzahl eines Monats zu ermitteln.[/ironie]lunar hat geschrieben:Ansonsten kannst Du in Deinem eigenen Programm nach Deinem Belieben verfahren, ...
Wenn Freude und Stolz verflogen sind, werde ich also isleap() und monthrange() importieren. Bleibt für mich nur die Frage nach dem warum? Schießt man nicht mit Kanonen auf Spatzen, wenn man wegen 5 oder 6 Zeilen Programmcode auf eine externe Bibliothek zugreift? Bei einer built-in Funktion ist das ja überhaupt kein Thema, aber extra importieren?lunar hat geschrieben:Ich persönlich würde die Verwendung einer eigenen Implementierung gegenüber einer Bibliothek immer kritisieren, ...