Elemente aus Liste 'herauspicken'...?

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.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

:oops:
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Benutzeravatar
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
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

noisefloor hat geschrieben:erster Tag = Name des Wochentags? Das kannst mit strftime aus dem time-Modul machen.
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.

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)
Das Problem war, dass ich nicht einfach nur um die Differenz zwischen dem aktuellen weekday() und dem gewünschten first_weekday springen kann. Das funktioniert nur, solange das gesuchte Datum hinter oder gleich day ist.
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 ;-) )
Benutzeravatar
snafu
User
Beiträge: 6881
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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)
Sofern beim aktuellen Wochentag nicht zurückgegangen werden soll, müsste das if-Statement halt nur auf kleiner-als testen.
BlackJack

@mutetella: Eine Frage ausser der Reihe: Das `calendar`-Modul aus der Standardbibliothek ist Dir bekannt!?
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@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
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Benutzeravatar
snafu
User
Beiträge: 6881
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

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).
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:Also mir ist bewusst, du willst damit auch nur die Eingabe validieren, ...
Wie gesagt, darum geht es nicht.
snafu hat geschrieben:... PEP-8 konform ...
Da hab' ich immer wieder meine Fragezeichen... Was ist an meinem Beispiel nicht konform?

Gruß
mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Benutzeravatar
snafu
User
Beiträge: 6881
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Zumindest der Funktionsname sollte keine Kamelhöcker haben. Und `day` für ein Datum ist auch nicht wirklich passend.
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.
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.
Benutzeravatar
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
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

snafu hat geschrieben:Zumindest der Funktionsname sollte keine Kamelhöcker haben.
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.
Gibt es da eine Regel oder wie machst Du / machen andere das?
snafu hat geschrieben:... und ich bin da übrigens anderer Meinung.
Die würde mich sehr interessieren!

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 ;-) )
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

noisefloor hat geschrieben:Nimm' doch isoweekday aus datetime. Da ist Montag der erste Tag.
Welchen Nutzen bringt das?

Gruß
mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Benutzeravatar
noisefloor
User
Beiträge: 4209
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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

Gruß, noisefloor
Zuletzt geändert von noisefloor am Freitag 18. Juni 2010, 10:11, insgesamt 1-mal geändert.
Benutzeravatar
snafu
User
Beiträge: 6881
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@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.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@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
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

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]
Antworten