
Elemente aus Liste 'herauspicken'...?

Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit
)

- noisefloor
- User
- Beiträge: 4209
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
@mutetella: erster Tag = Name des Wochentags? Das kannst mit strftime aus dem time-Modul machen.
EDIT: wenn's nur um ein Datum geht, ist das mit dem datetime-Modul noch einfacher. Da gibt es sogar 2 Möglichkeiten (weekday und isoweekday).
Gruß, noisefloor
@mutetella: erster Tag = Name des Wochentags? Das kannst mit strftime aus dem time-Modul machen.
EDIT: wenn's nur um ein Datum geht, ist das mit dem datetime-Modul noch einfacher. Da gibt es sogar 2 Möglichkeiten (weekday und isoweekday).
Gruß, noisefloor
Meine Funktion liefert nicht den Namen des Wochentages, sondern den ersten Tag der aktuellen Woche, abhängig davon, ob Mo, Di, Mi, Do, Fr, Sa oder So als erster Tag der Woche eingestellt ist.noisefloor hat geschrieben:erster Tag = Name des Wochentags? Das kannst mit strftime aus dem time-Modul machen.
Ich habe das folgendermaßen gelöst:
Code: Alles auswählen
def getFirstWeekday(self, day, first_weekday):
'''
Returns the first day of the week,
depending on day and first_weekday
day = datetime.date()-Object
first_weekday = 0 (Mon), 1 (Thu), 2 (Wed),
3 (Thu), 4 (Fri), 5 (Sat) or 6 (Sun)
'''
#If day.weekday() is smaller than first_weekday,
#respectively first_weekday must be one of past days
minus = (0, 1, 2, 3, 4, 5, 6)[day.weekday() -
first_weekday]
return day - timedelta(minus)
Beispiel:
Die Voreinstellung für den ersten Tag der Woche ist Mi, also first_weekday = 2
Heute ist Do, der 17.06., also day.weekday() = 3
Differenz day.weekday() zu first_weekday = 1
17.06. - 1 Tag = gesuchte Tag, Mi, der 16.06.
Das Beispiel funktioniert nicht mehr, wenn first_weekday = 3, also Fr ist. Selbst wenn ich dann die Rechnung umkehre, lande ich beim Fr, den 18.06., gesucht ist aber Fr, der 11.06.
Deshalb habe ich eine Funktion basteln müssen.
Oder geht es doch einfacher und ich weiß wieder mal nix davon...??
Gruß
mutetella
EDIT: Das 'self' als Parameter muss natürlich raus, hab' ich vergessen... Die Funktion ist eigentlich 'ne Methode innerhalb meiner TimeFrame()-Klasse, die dafür zuständig ist, der Kalenderansicht alle nötigen Daten (=> Datum) zu liefern und darüber zu navigieren.
Zuletzt geändert von mutetella am Donnerstag 17. Juni 2010, 09:16, insgesamt 1-mal geändert.
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit
)

Code: Alles auswählen
from datetime import timedelta
def get_past_date(startdate, weekday):
if weekday not in range(7):
raise ValueError, 'Weekday must be between 0-6'
distance = startdate.weekday() - weekday
if distance <= 0:
# negative distance will go forward
startdate -= timedelta(weeks=1)
return startdate - timedelta(days=distance)
@mutetella: Eine Frage ausser der Reihe: Das `calendar`-Modul aus der Standardbibliothek ist Dir bekannt!?
@BlackJack
Kenn' ich, klar. Warum fragst Du?
@snafu
Ist Dein Beispiel ein anderer Weg zum selben Ziel oder gibt es darin einen kleinen aber feinen Unterschied...?
Gruß
mutetella
Kenn' ich, klar. Warum fragst Du?
@snafu
Ist Dein Beispiel ein anderer Weg zum selben Ziel oder gibt es darin einen kleinen aber feinen Unterschied...?
Gruß
mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit
)

Es kommt das selbe heraus (das ist ja schließlich dein Ziel), nur finde ich es lesbarer, PEP-8 konform und es kommt mit dem Zurückrechnen klar, wenn der gewünschte Wochentag größer als der aktuelle Wochentag ist. Dies ist zumindest in dem Code deines vorherigen Beitrags nicht beachtet worden. Wenn dort eine negative Differenz rauskommt, klappt schon der Indexzugriff am Anfang nicht mehr (den ich ohnehin unnötig finde). Also mir ist bewusst, du willst damit auch nur die Eingabe validieren, aber `in range(7)` finde ich da klarer und kürzer, zumal die Exception, wenn es kracht, dann auch eher verwirrend für den Benutzer wäre.
Gerade wegen einer negativen Differenz habe ich mir die Liste [0, 1, ..., 6] quasi als Schablone überlegt. Habe ich eine positive Differenz, wird von vorne gelesen, bei einer negativen Differenz von hinten. Ein Index-Error kann zudem nicht vorkommen, da die Rechnung immer nur 0 - 6 oder 6 - 0 lauten kann. Ok, außer der Übergabeparameter 'first_weekday' > 6, aber das wird bereits an anderer Stelle validiert, gehört imho auch nicht in diese Funktion/Methode.snafu hat geschrieben:... und es kommt mit dem Zurückrechnen klar, wenn der gewünschte Wochentag größer als der aktuelle Wochentag ist. [...] Wenn dort eine negative Differenz rauskommt, klappt schon der Indexzugriff am Anfang nicht mehr (den ich ohnehin unnötig finde).
Wie gesagt, darum geht es nicht.snafu hat geschrieben:Also mir ist bewusst, du willst damit auch nur die Eingabe validieren, ...
Da hab' ich immer wieder meine Fragezeichen... Was ist an meinem Beispiel nicht konform?snafu hat geschrieben:... PEP-8 konform ...
Gruß
mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit
)

Zumindest der Funktionsname sollte keine Kamelhöcker haben. Und `day` für ein Datum ist auch nicht wirklich passend.
Das wusste ich ja nicht und ich bin da übrigens anderer Meinung. Aber das soll mal Ansichtssache bleiben. Ich bin jetzt auch mal lieber still. Du wirkst plötzlich etwas gereizt auf Verbesserungsvorschläge.mutetella hat geschrieben:Ok, außer der Übergabeparameter 'first_weekday' > 6, aber das wird bereits an anderer Stelle validiert, gehört imho auch nicht in diese Funktion/Methode.
- noisefloor
- User
- Beiträge: 4209
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
@mutetella: Nimm' doch isoweekday aus datetime. Da ist Montag der erste Tag.
Gruß, noisefloor
@mutetella: Nimm' doch isoweekday aus datetime. Da ist Montag der erste Tag.

Gruß, noisefloor
Da bin ich auch immer hin- und hergerissen. Nachdem wxPython unüblicherweise in Funktionsnamen camelcase verwendet, weiß ich nicht so recht, an was ich mich halten soll. Der Gleichheit halber an die wxPython Schreibweise oder eigene Klassen/Funktionen PEP-konform. Wobei mir dieser Mix auch nicht wirklich gefällt.snafu hat geschrieben:Zumindest der Funktionsname sollte keine Kamelhöcker haben.
Gibt es da eine Regel oder wie machst Du / machen andere das?
Die würde mich sehr interessieren!snafu hat geschrieben:... und ich bin da übrigens anderer Meinung.
Gruß
mutetella
Zuletzt geändert von mutetella am Donnerstag 17. Juni 2010, 10:48, insgesamt 1-mal geändert.
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit
)

Welchen Nutzen bringt das?noisefloor hat geschrieben:Nimm' doch isoweekday aus datetime. Da ist Montag der erste Tag.
Gruß
mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit
)

- noisefloor
- User
- Beiträge: 4209
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,

Gruß, noisefloor
Na ja - dann ist es wie bei dir. Du hast ja auch Montag als 1. Tag. weekday definiert ja Sonntag als ersten Tag.Welchen Nutzen bringt das?

Gruß, noisefloor
Zuletzt geändert von noisefloor am Freitag 18. Juni 2010, 10:11, insgesamt 1-mal geändert.
@mutella:
IMHO sollte eine von außen aufrufbare Funktion eben bis zu einem gewissen Grad selbst validieren. Mit "gewissem Grad" meine ich das Vermeiden von expliziten Typprüfungen, wohl aber das Überprüfen des Werts an sich. Der Code dafür kann durchaus ausgelagert werden, aber sollte halt von der besagten Funktion aufgerufen werden. Ich würde eher nicht erwarten, dass eine Funktion im Stillen falsche Ergebnisse zurück gibt mit der Argumentation, dass man halt nur valide Werte übergeben soll und sich da vorher selbst drum kümmern muss. Ich denke in Python halt lieber bibliothekenmäßig (Wiederverwendbarkeit) anstatt davon auszugehen, dass meine Funktionen eh nur intern verwendet werden. Python kennt halt kein `static` und das ist auch gut so.
IMHO sollte eine von außen aufrufbare Funktion eben bis zu einem gewissen Grad selbst validieren. Mit "gewissem Grad" meine ich das Vermeiden von expliziten Typprüfungen, wohl aber das Überprüfen des Werts an sich. Der Code dafür kann durchaus ausgelagert werden, aber sollte halt von der besagten Funktion aufgerufen werden. Ich würde eher nicht erwarten, dass eine Funktion im Stillen falsche Ergebnisse zurück gibt mit der Argumentation, dass man halt nur valide Werte übergeben soll und sich da vorher selbst drum kümmern muss. Ich denke in Python halt lieber bibliothekenmäßig (Wiederverwendbarkeit) anstatt davon auszugehen, dass meine Funktionen eh nur intern verwendet werden. Python kennt halt kein `static` und das ist auch gut so.
@snafu:
Danke für Deinen Rat! Werde ich mir zu Herzen nehmen.
Und die Sache mit Funktions-/Klassennamen? Wie machst Du das? Wie ich weiter oben bereits geschrieben hab' weiß ich nicht so Recht, wie ich mit dem wxPython / Python Mix umgehen soll....
Gruß
mutetella
Danke für Deinen Rat! Werde ich mir zu Herzen nehmen.
Und die Sache mit Funktions-/Klassennamen? Wie machst Du das? Wie ich weiter oben bereits geschrieben hab' weiß ich nicht so Recht, wie ich mit dem wxPython / Python Mix umgehen soll....
Gruß
mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit
)

Der Falsche weg ist es komplett die Schreibweise von wx zu übernehmen. Sinnvoler ist es IMHO eine gewisse Trennung zu haben. Sachen die nichts mit der GUI zu tun haben bleiben PEP-8 konform. Eigene GUI-ELemente kannst du dann entweder wx-Style implementieren, um so zu verdeutlichen, dass es sich um GUI-Zeug handelt, oder du setzt komplett auf PEP-8 und kannst so eigene Implementierungen einfacher von wx unterscheiden.
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]