Seite 2 von 2

Verfasst: Mittwoch 12. November 2008, 15:42
von limepix
@BlackJack: Danke für die Kritik ... ich druck nen mir mal aus und leg nen mir mal unters kopfkissen ;-) ... werd auf jeden fall mal reinschaun

zum hintergrund: es soll eine art "taskplaner" entstehen - so wie das ding in windows. unserer soll per xml konfigurierbar sein

die xml struktur ist fest vorgegeben und schaut so aus:

Code: Alles auswählen

<?xml version="1.0" encoding="windows-1250"?>
<scheduler>    
  <module>
    <name>blaa</name>
    <active>1</active>
    <exec>C:\foo.py</exec>
    <time>
      <type>interval</type>
      <val>30</val>      
    </time>
  </module>
    
  <module>
    <name>doing</name>
    <active>1</active>
    <exec>C:\doing.py</exec>
    <time> 
        <mon>
           <val>09:20</val>  
           <val>13:18</val>             
        </mon>
        <wed>
           <val>14:30</val>             
        </wed>
    </time>
  </module>
</scheduler>
@BlackJack: es ist teil eine klasse namens scheduler...

so wieder zum allgemeinen...
ich weiss meinen jetzigen zeitpunkt, dazu gehört der wochentag, die stunde und die minute (auf gut deutsch - die uhrzeit) und anhand der xml weiss ich vom nächsten zeitpunkt ebenfalls wochentag, stunde und minute.
beispiel vom modul doing: nächster montag 9:20

meine vorgehensweise ist nun

1. minuten bis ende der aktuellen stunde ermitteln
2. stunden bis ende des aktuellen tages ermitteln
3. tage bis ende der aktuellen woche ermitteln

diese drei werte ergeben die zeit-bis-zum-ende-der-woche.

für unseren zeitpunkt hab ich ja schon alles:
0 tage (montag...)
9 stunden (9:uhr...)
15 minuten(:15 minuten...)

nun ist ja zeit-bis-zum-ende-der-woche + 0,9,15 = zeit bis zu dem zeitpunkt von dem ich bislang immer ausgehe, dass er in der nächsten woche ist.
wenn nun das was ich rausbekommen hab größer ist wie die gesamte anzahl in sek einer woche, weiss ich, dass ich mich quasi einmal selber "überrannt" habe und ziehe einfach eine woche in sekunden von meinem ergebnis ab...

ich hoff des war einigermaßen verständlich :oops:

nochmal @ BlackJack: weil ichs gerade gelesen hab:
mag sein, dass es eleganter geht (deswegen bin ich hier und frag nach ;-) ), aber als übung für unsre azubis hier wie man logisch / händisch an sowas ranzugehen hat, geh ich den weg auch gerne mal zu fuß :-) ... wenn mir nun noch ein spezl hier eine "2-zeilen-mega-schick" lösung präsentieren kann - nur her damit, dann kann ich auch ein "so" & "so nicht" zeigen :-)


vielen dank auf jeden fall für eure mühe und die superschnellen antworten :-)

Edit (BlackJack): Der Highlighter kann zwar nicht viel, aber XML kennt er :-) -> Highlighting von Python auf XML umgestellt.

Verfasst: Mittwoch 12. November 2008, 16:21
von numerix
limepix hat geschrieben:wenn mir nun noch ein spezl hier eine "2-zeilen-mega-schick" lösung präsentieren kann - nur her damit
Da genügt eine Zeile - wenn sie lang genug ist:

Code: Alles auswählen

from time import localtime
sec_bis_zeitpunkt = lambda tag,zeit:(tag*1440+sum([int(el)*60**(1-k) for k,el in enumerate(zeit.split(":"))])
                    +10080-(localtime()[6]*1440+localtime()[3]*60+localtime()[4]))%10080*60
print sec_bis_zeitpunkt(2,"17:00")
Edit: Zeilenumbruch eingefügt ...

Verfasst: Mittwoch 12. November 2008, 16:28
von wuf
Hallo limepix

Sorry meine peinliche Frage. Warum wird bei deiner Funktion Jahr und Monat nicht brücksichtigt?

Gruss wuf :wink:

Verfasst: Mittwoch 12. November 2008, 18:02
von limepix
wieso denn peinliche frage?? ^^

ganz einfach - es muss nicht berücksichtigt werden / wird nicht gebraucht
(kuck dir die xml mal an, da steht nichts von monaten oder jahren drin ;-) ) (wäre aber vllt ne schöne erweiterung die ich mit aufnehmen könnte - danke für den tip ;-) )

das beispiel von zuvor gefällt mir eigentlich am besten:
du weisst, dass jeden mittwoch um 15:00 Uhr der Eismann kommt und möchstest nun wissen, wie lange es bis dahin noch dauert.

Verfasst: Mittwoch 12. November 2008, 18:29
von str1442
Du meinst etwas ähnliches wie Cron?

Verfasst: Mittwoch 12. November 2008, 18:50
von wuf
Hallo limepix

Danke für die Antwort. Leider spreche ich die Sprache 'xml' nicht. Aber ich glaube deine Aufgabe wäre ideal für 'azubis'. Hast du das Modul 'time' schon einmal genauer angeschaut? Ist eine Fundgrube für realistische Zeitberechnungen.

Gruss wuf :wink:

Verfasst: Mittwoch 12. November 2008, 19:28
von numerix
@limepix: Hast du meinen Einzeiler mal ausprobiert?
Oder müssen es für deine "mega-schick"-Lösung unbedingt zwei Zeilen sein?

Das sollte dann nicht das Problem sein: :D

Code: Alles auswählen

sec_bis_zeitpunkt = lambda tag,zeit:(tag*1440+sum([int(el)*60**(1-k) for k,el in enumerate(zeit.split(":"))])
                    +10080-(localtime()[6]*1440+localtime()[3]*60+localtime()[4]))%10080*60
Liefert z.B.:

Code: Alles auswählen

In [4]: sec_bis_datum(3,"20:15")
Out[4]: 89340

Verfasst: Mittwoch 12. November 2008, 19:59
von BlackJack
@limepix: Du sagst zwar die XML-Struktur ist fest vorgegeben, aber mit fällt ein deutlicher Mangel an Attributen auf.

Und wenn ich mir die XML ansehe frage ich mich wie da aus einer Uhrzeit der Form '09:20' irgend wann im Programm die ganze Zahl 920 werden kann. Denn in der Form nimmt Deine Funktion das ja anscheinend entgegen. Wenn man so eine Uhrzeit "leichtgewichtig" als eine Einheit im Programm herum reichen will, bietet sich ein Tupel an.

Meine Frage nach der Methode war dadurch motiviert, dass es nur technisch gesehen eine Methode ist. Praktisch wird `self` nicht verwendet und damit könnte man es auch als (Hilfs)Funktion ausserhalb der Klasse platzieren. Falls es thematisch doch zu sehr mit der Klasse verbunden ist, könntest Du eine `staticmethod` daraus machen, dann weiss man dass das eigentlich eine Funktion ist und kann es auch so auf der Klasse aufrufen.

@numerix: Die Funktion kann böse daneben liegen, wenn man sie um Mitternacht herum aufruft, wenn die verschiednenen Aufrufe von `localtime()` nicht alle am gleichen Tag erfolgen. Und Dein Beitrag ist Schuld daran, dass ich jetzt beim lesen der anderen Beiträge einen vertikalen Scrollbalken bemühen muss. Grrr. ;-)

Verfasst: Mittwoch 12. November 2008, 20:09
von limepix
@ str1442: genau! sowas in die richtung - allerdings muss ich das alles händisch machen, für mein ihk projekt... ich hab das gesamte programm schon in c++ geschrieben, sollte es nun nochmal in python "nachschreiben" - so bin zu python gekommen ;-)
ziel des ganzen ist, den "wenigeraufwand" zu c++ zu ermitteln - wenn das für den teil in den die entwicklungrichtung unserer firma geht "große" vorteile bringt, wird python als neue sprache für die gesamte entwicklung / neue sachen herangezogen :-)

@numerix: FREAK! :wink: das schaut ja wild aus... um damit mal anzugeben, werd ichs einfach mal zeigen - das wird die vom hocker haun ;-)

danke nochmal

Verfasst: Mittwoch 12. November 2008, 20:09
von numerix
BlackJack hat geschrieben:@numerix: Die Funktion kann böse daneben liegen, wenn man sie um Mitternacht herum aufruft, wenn die verschiednenen Aufrufe von `localtime()` nicht alle am gleichen Tag erfolgen. Und Dein Beitrag ist Schuld daran, dass ich jetzt beim lesen der anderen Beiträge einen vertikalen Scrollbalken bemühen muss. Grrr. ;-)
Hab ich ja auch nur zum Angeben gemacht ... und jetzt geändert.

Ja, das mit Mitternacht ist ein echtes Problem. Ich stell mir das grad vor, wenn man ein paar Millisekunden vor Mitternacht das Programm startet, um nochmal kurz zu checken, wie lange es dauert, bis der Eismann kommt, und dann verpasst man am Ende noch den Eismann, weil das Programm nicht funktioniert hat. :cry:

Verfasst: Mittwoch 12. November 2008, 20:22
von limepix
@BlackJack: die xml struktur is nun mal so vorgegeben... die wird wo anders erzeugt und unser "taskplaner" muss damit zurecht kommen...
09:20 - so wies im xml -> es wird dann als str herausgelesen, der doppelpunkt entfernt und dann in n int gecastet (ich hoffe mit
int(meinzeitwertalsstring)
kann man das ohne probleme machen?! haut mir aufn kopf wenn mein buch jetzt schon so starke spuren hinterlassen hat :oops: )

*wo ichs grad seh - einmal in ints casten langt eigentlich ^^... ups...*

Verfasst: Mittwoch 12. November 2008, 22:28
von Leonidas
Erstens gib es in Python keine Casts und zweitesn würde man das eher so machen:

Code: Alles auswählen

time = tuple(int(e) for e in "09:20".split(':'))
So hat man die Zeit in Stunde und Minute, was im Gegensatz zum String semantisch eher korrekt ist.

Verfasst: Mittwoch 12. November 2008, 22:33
von BlackJack
@limepix: Vielleicht sollte ich rethorische Fragen sein lassen. :-) Mir ist schon klar wie man von so einer Zeichenkette zu so einer Zahl kommt, mir ist nicht klar *warum* man eine Darstellung wo beide Teile vermischt sind in eine andere Darstellung wo beide Teile vermischt sind umwandelt, die man dann später trennen muss, wass man gleich am Anfang mal hätte richtig machen können.

Was Du auf keinen Fall machen solltest ist das C++-Programm einfach 1:1 nach zu schreiben. Also auch nicht einfach so die Struktur kritiklos übernehmen.

Verfasst: Donnerstag 13. November 2008, 01:21
von Qubit
Leonidas hat geschrieben:Erstens gib es in Python keine Casts und zweitesn würde man das eher so machen:

Code: Alles auswählen

time = tuple(int(e) for e in "09:20".split(':'))
So hat man die Zeit in Stunde und Minute, was im Gegensatz zum String semantisch eher korrekt ist.
oder (als list)

Code: Alles auswählen

time = map(int,("09:20".split(':')))

Verfasst: Donnerstag 13. November 2008, 01:39
von Leonidas
Qubit hat geschrieben:oder (als list)
Listen sind gut für viele gleichartige Daten, aber Stunde und Minute sind nicht gleichartig, dafür sind eher Tupeln gedacht.

Verfasst: Donnerstag 13. November 2008, 08:16
von limepix
@BlackJack: Genau wegen der Kritik bin ich ja hier :-). Wie gesagt meine python erfahrung geht bis anfang dieser woche zurück... sooo viel kann man da doch noch nich wissen :oops:
und das andere - ja doppelt gemoppelt hält bekanntlich besser ^^ - ne spass bei seite - ich habs schon rausgenommen!

@Leonidas: wenn ichs mir so anschau, hast du recht, klar :-)
und wenn man sowas auch öfter mal gesehen hat, kommt man auch selber drauf... *mit-umbau-anfang*