Hilfe mit json/pickle in python 3+

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.
BlackJack

@astrionn: Du hast `start()` nicht ”privat” gemacht sondern so getan als wenn es eine ”magische” Methode wäre. Namen mit zwei führenden und abschliessenden Unterstrichen sind eigentlich den Sprachentwicklern vorbehalten. Etwas als nicht-öffentlich kennzeichnen geht mit *einem* führenden Unterstrich. *Nicht* mit zwei. Das bedeutet etwas anderes und wird fast nie gebraucht. Lass das einfach bleiben.

Und nicht-öffentlich, wegen einem führenden Unterstrich ist `os._exit()`. Das soll man genau so wenig benutzen wie Methoden die *Du* selbst so markierst. Wir haben jetzt schon geklärt dass das `sys`-Modul auch unter Linux existiert und Du hast sogar ``sys.exit()`` als Kommentar über dem ``os._exit()`` stehen gehabt, weisst aber nicht wie Du das jetzt ändern sollst‽ Du musst halt an der Stelle die Schleife beenden. Das geht mit `sys.exit()`, was natürlich etwas mehr macht als nur die Schleife zu beenden. Das ginge mit ``return`` was auch etwas mehr macht also nur die Schleife zu beenden, nämlich die Funktion beenden. Und das ginge mit ``break``. Was die Schleife beendet.

Ich könnte jetzt noch so einiges zu dem Quelltext sagen. Allerdings wurde das alles schon mal gesagt…
Benutzeravatar
pillmuncher
User
Beiträge: 1530
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

astrionn hat geschrieben:ich hab noch ein paar mehr sachen gemacht z.b. start privat gemacht

Code: Alles auswählen

    def __start__(self):
        ...
Man kann Attribute und Methoden in Python nicht wirklich privat machen, man kann aber sie als nicht zum öffentlichen Interface gehörig markieren. Dazu gibt man dem Attribut / der Methode per Konvention einen Namen, der mit einem einzelnen Unterstrich beginnt. Namen, die zwei führende und zwei abschließende Unterstriche im Namen haben, sind sog. special methods / attributes, die in Python eine besondere Bedeutung haben, je nach Methode / Attribut. Welche das jeweils ist, steht in der Dokumentation. Auch manche Frameworks wie etwa Django oder SQLAlchemy verwenden für bestimmte Zwecke solche Namen, aber die Benennung impliziert in keiner Weise irgendeine Form der Privatheit. Außerdem gibt es noch Namen, die mit zwei führenden Unterstrichen beginnen, aber nicht mit zwei Unterstrichen enden. Diese verursachen sog. name mangling, welches man manchmal benötigt, um Namenskonflikte aufzulösen, wenn man mit Multipler Vererbung konfrontiert ist. Man sollte diese Art von Namen nur verwenden, wenn man sie wirklich braucht, was fast nie der Fall ist.
In specifications, Murphy's Law supersedes Ohm's.
Sirius3
User
Beiträge: 18265
Registriert: Sonntag 21. Oktober 2012, 17:20

@astrionn: schau Dir nochmal mein Beispiel zu den for-Schleifen an. So wie sie jetzt da stehen, sind sie quatsch, weil die Listenelemente gar nicht benutzt werden. Das mit der Platformüberprüfung ist auch quatsch: wenn's tut dann tut's, wenn nicht, dann gibt es eine aussagekräftigere Fehlermeldung. Mac-User werden jedenfalls ohne Grund ausgeschlossen.
astrionn
User
Beiträge: 43
Registriert: Freitag 28. Februar 2014, 19:20

okay das mit den beiden unterstrichen vorne und hinten wusste ich nicht tut mir leid sofort wieder geändert!

das mit sys.exit() oder os._exit() : ich hatte erst die sys variante aber diese hat unter linux nicht funktioniert und die os methode shcien auf beiden systemen zu funktionieren.

ich habe nun die os erkennung rausgenommen und mit try-except geregelt .

@sirius3 machen alle for-schleifen keinen sinn ? ich glaube ich habe das prinzip mit i,j in xxx nicht verstanden gehört das zu der "normalen" schleife wie man das kennt weil wenn ich das google find ich nichts dazu
Anfänger in den Kinderschuhen aber bestrebt besser zu werden ():O
BlackJack

@astrionn: Die `sys.exit()`-Variante funktioniert unter Linux. Wirklich. Ich benutze das. Viele andere benutzen das. Es ist *sehr* unwahrscheinlich das Du der erste bist dem auffällt das die Funktion unter Linux nicht gehen würde.

Das einzige was passieren kann ist das Du Dir selber irgendwo in den Fuss schiesst weil irgendwo in der Aufrufhierarchie ein nacktes oder zu allgemeines ``except`` dafür sorgt das die `SystemExit`-Ausnahme nicht bis nach oben durchschlägt sondern nicht angemessen behandelt wird.
astrionn
User
Beiträge: 43
Registriert: Freitag 28. Februar 2014, 19:20

bei mir unter windoof hat sys.exit funktioniert mit gleichem code unter linux wiederum nicht deswegen bin ich auch erst auf die platform unterscheidung gekommen aber okay ich probiere dass gerne noch mal mit sys unter linux auch wenn ich ehrlich sagen muss dass ich noch nicht ganz verstanden habe wieso man os._exit nicht benutzen sollte "nur" weil es einen _ hat klar dieser _ ist eine markierung für privat aber was dies wirklich bedeutet und wieso dass dort an dieser stelle weiß ich nicht und ich sollte es schließlich verstehen oder ? ^.^
Anfänger in den Kinderschuhen aber bestrebt besser zu werden ():O
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

astrionn hat geschrieben:ich glaube ich habe das prinzip mit i,j in xxx nicht verstanden gehört das zu der "normalen" schleife wie man das kennt weil wenn ich das google find ich nichts dazu
Das ist ganz normales Tuple unpacking.

Code: Alles auswählen

>>> i = ('a', 'b')
>>> print(i)
('a', 'b')
>>> i, j = ('a', 'b')
>>> print(i)
a
>>> print(j)
b
Jetzt zu deinem Code.

Code: Alles auswählen

datas=[]
for idx, stunde in enumerate (self.stunden,0):
    datas.append(self.stunden[idx].save())
Du verwendest idx um per Index auf das entsprechende Element der Liste zuzugreifen. Du hast aber das Element schon in stunde. Da du idx sonst nicht in der Schleife verwendest kannst du dir diesen Wert auch sparen.

Code: Alles auswählen

datas=[]
for stunde in self.stunden:
    datas.append(stunde.save())
Das kann man jetzt auch noch als List comprehension formulieren.

Code: Alles auswählen

datas = [stunde.save() for stunde in self.stunden]
astrionn
User
Beiträge: 43
Registriert: Freitag 28. Februar 2014, 19:20

@/me uh danke gutes beispiel wenn man also for i,j in enumerate(liste) hat ist i = listenplatz und j das objekt an dieser stelle ?
Anfänger in den Kinderschuhen aber bestrebt besser zu werden ():O
Sirius3
User
Beiträge: 18265
Registriert: Sonntag 21. Oktober 2012, 17:20

@astrionn: warum man nicht os._exit benutzen soll, kann ja je nach System unterschiedliche Gründe haben. Um diese Systemunterschiede auszugleichen, haben die Python-Entwickler sys.exit erfunden. Beides solltest Du nicht benutzen, weil es die Benutzbarkeit von Funktionen stark einschränkt. Die main-Funktion auf den üblichen Weg zu verlassen, in dem sie ihr natürliches Ende erreicht (also z.B. mit break die Schleife verlassen), ist in 99.9% der Fälle die einzig valide Methode.
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

astrionn hat geschrieben:wenn man also for i,j in enumerate(liste) hat ist i = listenplatz und j das objekt an dieser stelle ?
enumerate liefert beim Durchlaufen ein Tupel aus einem Zähler und dem eigentlichen Element. Der Zähler entspricht dann der Position des Elements in der Liste wenn der zweite Parameter (start) von enumerate entweder nicht angegeben wurde oder überflüssigerweise noch einmal explizit auf 0 gesetzt wurde.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

astrionn hat geschrieben:... wenn man also for i,j in enumerate(liste) hat ist i = listenplatz und j das objekt an dieser stelle ?
Ja!

Aber das hättest Du doch ganz einfach in einer Python-Shell ausprobieren können ;-)

Code: Alles auswählen

l = ["foo", "bar"]

for index, obj in enumerate(l):
    print(index, obj)

> 
0 foo
1 bar
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@astrionn: Wenn etwas als nicht-öffentlich gekennzeichnet ist dann brauchst Du nicht verstehen warum. Das geht Dich nichts an. Wenn das interessant für Dich wäre, dann hätte es der Autor nicht als nicht-öffentlich gekennzeichnet.

Allerdings ist *diese* Funktion sogar dokumentiert und in der Dokumentation steht was die Funtkion macht, woraus folgt warum man die nicht verwenden sollte, dort steht das der Standardweg `sys.exit()` ist, und da steht unter welchem Ausnahmeumstand man doch `os._exit()` verwenden könnte. Was wahrscheinlich der Grund ist warum die Funktion überhaupt dokumentiert wurde.
astrionn
User
Beiträge: 43
Registriert: Freitag 28. Februar 2014, 19:20

@Sirius3 @BlackJack okay dann probiere ich nochmal sys.exit() und wenn das nicht funktioniert dann mach ich break und sys.exit unten drunter außerhalb der while schleife klingt besser ?

ich hab jetzt versucht das mit dem for i,j in xxx umzusetzten :

Code: Alles auswählen

def anzeigen(self):
        """Methode: Ruft die Methode anzeigen() jeden Objekts in der liste self.stunden auf"""
        #        """Methode: Ruft die Methode anzeigen() jeden Objekts in der liste self.stunden auf"""

        for idx, stunde in enumerate(self.stunden, 1):
            print(idx)
            stunde.anzeigen()
habe das jetzt so umgesetzt hoffe das ist richtig ?
Anfänger in den Kinderschuhen aber bestrebt besser zu werden ():O
Sirius3
User
Beiträge: 18265
Registriert: Sonntag 21. Oktober 2012, 17:20

@astrionn: wie oft noch! Gar kein "exit"!
astrionn
User
Beiträge: 43
Registriert: Freitag 28. Februar 2014, 19:20

@Sirius3 oh sorry ich hatte irgendwo gelesen d ich das auch benutzen könne/solle zumindest anstatt von os._exit ... und wie kann ich dass dann beenden ? soll ich main() verlassen und es dann dabei belassen ? und nur so nebenbei wieso gibts eigentlich funktionen die man nicht benutzen sollte ? habs schon so geändert im code:

Code: Alles auswählen

# -*- coding: UTF8 -*-
#!/usr/bin/env python3
import os
import platform
import sys
import json
import pprint
import time
import pickle

class stunde:
    """ Eine einzelne Stunde """

    def __init__(self):
        """Konstruktor : Erschafft eine stunde mit einem leeren Wörterbuch"""
        #Konstruktor : Erschafft eine stunde mit einem leeren Wörterbuch
        self.daten = {}

    def _start(self):
        """Private Methode: Weißt self.daten Standardwerte zu"""
        #Private Methode: Weißt self.daten Standardwerte zu
        self.daten = {'Fach': "    ", 'Raum': "    ", 'Lehrer': "    "}


    def aendern(self,was,information):
        """Methode: Probiert den Wert "was" des Wörterbuchs zu "information" zu ändern """
        #        """Methode: Probiert den Wert "was" des Wörterbuchs zu "information" zu ändern """

        try:
            self.daten[was]=information
        except:
            print('Fehler bei der Eingabe bitte auch Groß/Kleinschreibeung beachten')

    def anzeigen(self):
        """Methode: Gibt self.daten aus"""
        #        """Methode: Gibt self.daten aus"""

        print ("       ",self.daten )

    def save (self):
        """Methode: Gibt self.daten zum Speichern zurück"""
        #        """Methode: Gibt self.daten zum Speichern zurück"""

        return self.daten

    def load(self,data):
        """Methode: Setzt self.daten auf data welches als dict übergeben wird"""
        #        """Methode: Setzt self.daten auf data welches als dict übergeben wird"""

        try:
            self.daten=data
        except:
            print("Fehler beim Laden")

    def raum(self):
        """Methode: Gibt den Wert des Schlüssels "Raum" aus"""
        #        """Methode: Gibt den Wert des Schlüssels "Raum" aus"""

        print("Raum : ",self.daten['Raum'])


class tag:
    """Arbeitstag"""
    def __init__(self):
        """Konstruktor: Erschafft eine leere Liste"""
        #        """Konstruktor: Erschafft eine leere Liste"""

        self.stunden = []

    def _start(self):
        """Private Methode: Fügt self.stunden 11 Stunden hinzu und ruft __start__() dieser auf"""
        #        """Private Methode: Fügt self.stunden 11 Stunden hinzu und ruft __start__() dieser auf"""

        for i in range(11):
            std = stunde()
            self.stunden.append(std)
            self.stunden[i]._start()

    def aendern(self,tagwas,was,information):
        """Methode: Probiert die Methode "aendern" mit den parametern "was" und "informationen" des Objekts auf der liste self.stunden an der stelle tagwas-1 aufzurufen"""
        #        """Methode: Probiert die Methode "aendern" mit den parametern "was" und "informationen" des Objekts auf der liste self.stunden an der stelle tagwas-1 aufzurufen"""

        try :
            self.stunden[tagwas-1].aendern(was,information)
        except:
            print("Dieser tag hat nur " , len(self.stunden) , "Stunden. Bitte eine dieser wählen")

    def anzeigen(self):
        """Methode: Ruft die Methode anzeigen() jeden Objekts in der liste self.stunden auf"""
        #        """Methode: Ruft die Methode anzeigen() jeden Objekts in der liste self.stunden auf"""

        for idx, stunde in enumerate(self.stunden, 1):
            print(idx)
            stunde.anzeigen()

    def save (self):
        """Methode: Erzeugt eine leere Liste und fügt dieser die return werte der methode save() welche für jedes objekt auf der liste self.stunden aufgerufen wird und gibt diese liste wieder"""
        #        """Methode: Erzeugt eine leere Liste und fügt dieser die return werte der methode save() welche für jedes objekt auf der liste self.stunden aufgerufen wird und gibt diese liste wieder"""

        datas = [stunde.save() for stunde in self.stunden]
        return datas

    def load(self,data):
        """Methode: Erschafft für jedes Objekt in data eine stunde und ruft für diese die methode load mit dem parameter"""
        #        """Methode: Erschafft für jedes Objekt in data eine stunde und ruft für diese die methode load mit dem parameter"""

        for i in data:
            std = stunde()
            std.load(i)
            self.stunden.append(std)

    def raum(self):

        for idx,stunde in enumerate(self.stunden,1):
            print(idx)
            stunde.raum()

class woche:

    def __init__(self):

        self.tage = []
        self._start()

    def _start(self):

        laufpfad=os.path.dirname(sys.argv[0])
        laufpfad=os.path.join(laufpfad,"datas","data")
        if os.path.exists(laufpfad):
            with open(laufpfad,"rb") as ladedatei:
                data=pickle.load(ladedatei)
            self.load(data)
        else:
            for i in range(5):
                day = tag()
                self.tage.append(day)
                self.tage[i].__start__()
            print("Willkommen bei der Erstbenutzung diesen Programms ! Viel Spaß!")
        
        

    def aendern(self,wochewas,tagwas,was,information):

        try:
            self.tage[wochewas-1].aendern(tagwas,was,information)
        except:
            print("Diese Woche hat nur " , len(self.tage) , "Tage zur Auswahl. Bitte einen dieser wählen")


    def anzeigen(self , ouf = sys.stderr):

        for idx,tag in enumerate(self.tage,1):
            
            """
            if idx == 1 :
                print("Montag ",file = ouf),self.tage[0].anzeigen()
            if idx == 2 :
                print("Dienstag ",file = ouf),self.tage[1].anzeigen()
            if idx == 3 :
                print("Mittwoch ",file = ouf),self.tage[2].anzeigen()
            if idx == 4 :
                print("Donnerstag ",file = ouf),self.tage[3].anzeigen()
            if idx == 5 :
                print("Freitag ",file = ouf),self.tage[4].anzeigen()
            """
            #wie montag usw machen ? eine 2.te for schleife & eine liste von mo-fr und diese mit enumerate(liste,1) ?
            print("Tag",idx,file=ouf)
            tag.anzeigen()

    def save(self):
        aktuell = platform.system()
        try:
                print(str(aktuell)," detected as OS!")
                ordner=os.path.dirname(sys.argv[0])
                neuerordner=os.path.join(ordner,"datas")
                if not os.path.exists(neuerordner):
                    os.mkdir(neuerordner)
                    print("Unterverzeichnis angelegt")
                data=[]
                #das hier drunter richtig ?
                for tag in self.tage:
                    data.append(tag.save())
                neuerpfad=os.path.join(neuerordner,"data")
                with open(neuerpfad,"wb") as filename:
                    data2save=data
                    pickle.dump(data2save,filename)
                print("Daten erfolgreich gespeichert")
        except:
            print("Dein Betriebssystem ,",aktuell,"wird leider nicht unterstützt")

        

    def load(self,data):

        for i in data:
            day = tag();
            day.load(i);
            self.tage.append(day)
        print("Daten geladen")

    def raum(self , ouf = sys.stderr):

        for idx,tag in enumerate(self.tage,1):
            print("Tag ", idx , file = ouf ),tag.raum()

def main():
    week=woche()
    eingabe = ""
    while True:
        print()
        print(" Eintragungen zu einem (T)ag ändern? ")
        print(" Wochenplanplan (a)nzeigen? ")
        print(" (R)aumplan der Woche anzeigen")
        print(" Einen (b)estimmten Tag anzeigen?")
        print(" Den Raumplan (f)ür einen bestimmten Tag anzeigen?")
        print(" (E)nde? ")
        print()
        eingabe = input(' Ihre Wahl? ').lower()
        print()
        if eingabe in ['t']:
            while True:
                wochewas =(input('Welchen Tag wollen Sie bearbeiten? (Bitte Zahl angeben!) '))
                try:
                    wochewas = int(wochewas)
                    break
                except ValueError :
                    print("Nur Zahlen eingeben bitte")
            while True :
                tagwas = (input('Welche Stunde wollen Sie bearbeiten? (Bitte Zahl angeben!) '))
                try:
                    tagwas = int(tagwas)
                    break
                except ValueError :
                    print("Nur Zahlen eingeben bitte")
            stdwas = input('Welche Information wollen Sie eintragen? (Fach, Raum oder Lehrer?) ').title()
            inf = input('Was soll eingetragen werden?(Maximal 4 Zeichen) ')[:4].ljust(4)
            week.aendern(wochewas,tagwas,stdwas,inf)
        elif eingabe in ['a']:
            week.anzeigen()
        elif eingabe in ['r']:
            week.raum()
        elif eingabe in ['b']:
            while True:
                was=input("Welchen Tag wollen sie anzeigen lassen ? (Nur Zahlen bitte !")
                try:
                    was=int(was)
                    break
                except ValueError:
                    print("Nur Zahlen eingeben bitte!")
            week.tage[was-1].anzeigen()
        elif eingabe in ['f']:
            while True:
                was=input("Von welchem Tag wollen sie den Raumplan anzeigen lassen ?(Nur Zahlen bittte!)")
                try:
                    was=int(was)
                    break
                except ValueError:
                    print("Nur Zahlen bitte!")
            week.tage[was-1].raum()
        elif eingabe in["e"]:
                warten=input('Bitte nochmal Enter drücken! ')
                week.save()
                time.sleep(1)
                print("Auf Wiedersehen!")
                #sys.exit(0)
                #os._exit(0)
                break
        elif eingabe in ['s']:
            
            week.save()
            
        elif eingabe in ['l']:
            pfad=os.path.dirname(sys.argv[0])
            echterpfad=os.path.join(pfad,"datas","data")
            try:
                with open(echterpfad,"rb") as file:
                    weekdata=pickle.load(file)
                    week.load(weekdata)
            except FileNotFoundError:
                print("Keine Daten gefunden") 
        else :
            print("Bitte ein Buchstaben aus den Klammern oben wählen!")
        

print("Ihr Stundenplaner wurde geladen!")
if __name__ == '__main__':
    main()
Anfänger in den Kinderschuhen aber bestrebt besser zu werden ():O
BlackJack

@astrionn: Du machst mich echt fertig: Warum wolltest *Du* denn das jemand die `start()`-Methode nicht benutzt? Es gibt halt Sachen die schreibt man um sie selber zu benutzen und die sind nicht dazu gedacht das sie irgendjemand von aussen benutzt. Zum Beispiel weil sie wenn sie nicht richtig verwendet werden komische Effekte haben, oder weil sie keinen allgemeinen Nutzen haben, weil sie auf einer Ebene unterhalb dessen was man als API nach aussen verfügbar machen möchte operieren, oder weil man sie jederzeit ändern können möchte ohne das sich für jemand anderen etwas ändert, oder…

Das ist letztendlich auch die Sache von demjenigen der so etwas schreibt. Der ist Dir keine Erklärung schuldig. Es gibt eine öffentliche API, die ist zum benutzen da, alles andere sind Implementierungsdetails die Dich nichts angehen. Die kannst Du benutzen, aber wenn Du damit auf die Fresse fällst, der Rechner explodiert, oder deswegen irgendwo kleine Kätzchen ertrinken, bist *Du* selbst schuld.

`os._exit()` beendet den Interpreter nicht auf die dafür vorgesehene Weise. Stell dir als Analogie vor das Du den Rechner nicht herunterfährst (`sys.exit()`) sondern einfach den Netzstecker im laufenden Betrieb ziehst (`os._exit()`). Das kann man natürlich machen, es ”funktioniert” auch, der Rechner ist danach aus, und zumindest bei modernen Dateisystemen kann man normalerweise auch wieder problemlos starten. Aber das macht man halt nicht so, ausser in ganz bestimmten und sehr seltenen Ausnahmefällen.
astrionn
User
Beiträge: 43
Registriert: Freitag 28. Februar 2014, 19:20

@BlackJack okay tut mir leid ich hab das it den unterstrichen halt gelesen und dachte mir ich probiers mal aus aber ich lass die spielerein dann einfach okay ? und deine erklärung ist verständlich danke dazu
Anfänger in den Kinderschuhen aber bestrebt besser zu werden ():O
astrionn
User
Beiträge: 43
Registriert: Freitag 28. Februar 2014, 19:20

@BlackJack ich habe jetzt load und save in aussagekräftigere Methoden umbenannt und versucht die Logik dahinter gut zu machen habe ich das hinbekommen ?
Sollte ich es hinbekommen haben gib mir bitte einen Tipp wie ich die for schleife in anzeigen von woche so gesatelten kann dass sie auch die Wochentage ausgibt an statt Tag 1 /2 /3 /4 /5 und ohne meine "ifs" dadrinne :)

Code: Alles auswählen

# -*- coding: UTF8 -*-
#!/usr/bin/env python3
import os
import platform
import sys
import json
import pprint
import time
import pickle

class stunde:
    
    """ Eine einzelne Stunde """

    def __init__(self):
        
        """Konstruktor : Erschafft eine stunde mit einem leeren Wörterbuch"""
        #Konstruktor : Erschafft eine stunde mit einem leeren Wörterbuch
        
        self.daten = {}


    def
    start(self):
        
        """Private Methode: Weißt self.daten Standardwerte zu"""
        #Private Methode: Weißt self.daten Standardwerte zu
        
        self.daten = {'Fach': "", 'Raum': "", 'Lehrer': ""}


    def aendern(self,was,information):
        
        """Methode: Probiert den Wert "was" des Wörterbuchs zu "information" zu ändern """
        #        """Methode: Probiert den Wert "was" des Wörterbuchs zu "information" zu ändern """

        try:
            self.daten[was]=information
        except:
            print('Fehler bei der Eingabe bitte auch Groß/Kleinschreibeung beachten')


    def anzeigen(self):
        
        """Methode: Gibt self.daten aus"""
        #        """Methode: Gibt self.daten aus"""

        print ("       ",self.daten )


    def zu_speichernde_daten_ausgeben (self):
        
        """Methode: Gibt self.daten zum Speichern zurück"""
        #        """Methode: Gibt self.daten zum Speichern zurück"""

        return self.daten


    def geladene_daten_annehmen(self,data):
        
        """Methode: Setzt self.daten auf data welches als dict übergeben wird"""
        #        """Methode: Setzt self.daten auf data welches als dict übergeben wird"""

        try:
            self.daten=data
        except:
            print("Fehler beim Laden")


    def raum(self):
        
        """Methode: Gibt den Wert des Schlüssels "Raum" aus"""
        #        """Methode: Gibt den Wert des Schlüssels "Raum" aus"""

        print("Raum : ",self.daten['Raum'])


class tag:
    
    """Arbeitstag"""

    
    def __init__(self):
        
        """Konstruktor: Erschafft eine leere Liste"""
        #        """Konstruktor: Erschafft eine leere Liste"""

        self.stunden = []


    def start(self):
        
        """Private Methode: Fügt self.stunden 11 Stunden hinzu und ruft start() dieser auf"""
        #        """Private Methode: Fügt self.stunden 11 Stunden hinzu und ruft start() dieser auf"""

        for i in range(11):
            std = stunde()
            self.stunden.append(std)
            self.stunden[i].start()


    def aendern(self,tagwas,was,information):
        
        """Methode: Probiert die Methode "aendern" mit den parametern "was" und "informationen" des Objekts auf der liste self.stunden an der stelle tagwas-1 aufzurufen"""
        #        """Methode: Probiert die Methode "aendern" mit den parametern "was" und "informationen" des Objekts auf der liste self.stunden an der stelle tagwas-1 aufzurufen"""

        try :
            self.stunden[tagwas-1].aendern(was,information)
        except:
            print("Dieser tag hat nur " , len(self.stunden) , "Stunden. Bitte eine dieser wählen")


    def anzeigen(self):
        
        """Methode: Ruft die Methode anzeigen() jeden Objekts in der liste self.stunden auf"""
        #        """Methode: Ruft die Methode anzeigen() jeden Objekts in der liste self.stunden auf"""

        for idx, stunde in enumerate(self.stunden, 1):
            print(idx)
            stunde.anzeigen()


    def zu_speichernde_daten_ausgeben (self):
        
        """Methode: Erzeugt eine leere Liste und fügt dieser die return werte der methode zu_speichernde_daten_ausgeben() welche für jedes objekt auf der liste self.stunden aufgerufen wird und gibt diese liste wieder"""
        #        """Methode: Erzeugt eine leere Liste und fügt dieser die return werte der methode zu_speichernde_daten_ausgeben() welche für jedes objekt auf der liste self.stunden aufgerufen wird und gibt diese liste wieder"""

        datas = [stunde.zu_speichernde_daten_ausgeben() for stunde in self.stunden]
        return datas


    def geladene_daten_annehmen(self,data):
        
        """Methode: Erschafft für jedes Objekt in data eine stunde und ruft für diese die methode geladene_daten_annehmen mit dem parameter"""
        #        """Methode: Erschafft für jedes Objekt in data eine stunde und ruft für diese die methode geladene_daten_annehmen mit dem parameter"""
        for j in data:
            if len(self.stunden)<11:
                std = stunde()
                std.geladene_daten_annehmen(j)
                self.stunden.append(std)
            else:
                break


    def raum(self):

        for idx,stunde in enumerate(self.stunden,1):
            print(idx)
            stunde.raum()


class woche:

    def __init__(self):

        self.tage = []
        self.start()


    def start(self):

        laufpfad=os.path.dirname(sys.argv[0])
        laufpfad=os.path.join(laufpfad,"datas","data")
        if os.path.exists(laufpfad):
            with open(laufpfad,"rb") as ladedatei:
                data=pickle.load(ladedatei)
            self.geladene_daten_annehmen(data)
        else:
            for i in range(5):
                day = tag()
                self.tage.append(day)
                self.tage[i].start()
            print("Willkommen bei der Erstbenutzung diesen Programms ! Viel Spaß!")
        
        
    def aendern(self,wochewas,tagwas,was,information):

        try:
            self.tage[wochewas-1].aendern(tagwas,was,information)
        except:
            print("Diese Woche hat nur " , len(self.tage) , "Tage zur Auswahl. Bitte einen dieser wählen")


    def anzeigen(self , ouf = sys.stderr):

        for idx,tag in enumerate(self.tage,1):
            
            """
            if idx == 1 :
                print("Montag ",file = ouf),self.tage[0].anzeigen()
            if idx == 2 :
                print("Dienstag ",file = ouf),self.tage[1].anzeigen()
            if idx == 3 :
                print("Mittwoch ",file = ouf),self.tage[2].anzeigen()
            if idx == 4 :
                print("Donnerstag ",file = ouf),self.tage[3].anzeigen()
            if idx == 5 :
                print("Freitag ",file = ouf),self.tage[4].anzeigen()
            """
            #wie montag usw machen ? eine 2.te for schleife & eine liste von mo-fr und diese mit enumerate(liste,1) ?
            print("Tag",idx,file=ouf)
            tag.anzeigen()


    def speichern(self):
        
        aktuell = platform.system()
        try:
                print(str(aktuell)," detected as OS!")
                ordner=os.path.dirname(sys.argv[0])
                neuerordner=os.path.join(ordner,"datas")
                if not os.path.exists(neuerordner):
                    os.mkdir(neuerordner)
                    print("Unterverzeichnis angelegt")
                data=[]
                #das hier drunter richtig ?
                for tag in self.tage:
                    data.append(tag.zu_speichernde_daten_ausgeben())
                neuerpfad=os.path.join(neuerordner,"data")
                with open(neuerpfad,"wb") as filename:
                    data2zu_speichernde_daten_ausgeben=data
                    pickle.dump(data2zu_speichernde_daten_ausgeben,filename)
                print("Daten erfolgreich gespeichert")
                
        except:
            print("Dein Betriebssystem ,",aktuell,"wird leider nicht unterstützt")


    def geladene_daten_annehmen(self,data):

        self.tage=[]
        for i,j in enumerate(data):
            day=tag()
            self.tage.append(day)
            self.tage[i].geladene_daten_annehmen(j)
        print("Daten geladen")


    def raum(self , ouf = sys.stderr):

        for idx,tag in enumerate(self.tage,1):
            print("Tag ", idx , file = ouf ),tag.raum()


def main():
    
    week=woche()
    eingabe = ""
    while True:
        print()
        print(" Eintragungen zu einem (T)ag ändern? ")
        print(" Wochenplanplan (a)nzeigen? ")
        print(" (R)aumplan der Woche anzeigen")
        print(" Einen (b)estimmten Tag anzeigen?")
        print(" Den Raumplan (f)ür einen bestimmten Tag anzeigen?")
        print(" (E)nde? ")
        print()
        eingabe = input(' Ihre Wahl? ').lower()
        print()
        
        if eingabe in ['t']:
            while True:
                wochewas =(input('Welchen Tag wollen Sie bearbeiten? (Bitte Zahl angeben!) '))
                try:
                    wochewas = int(wochewas)
                    break
                except ValueError :
                    print("Nur Zahlen eingeben bitte")
            while True :
                tagwas = (input('Welche Stunde wollen Sie bearbeiten? (Bitte Zahl angeben!) '))
                try:
                    tagwas = int(tagwas)
                    break
                except ValueError :
                    print("Nur Zahlen eingeben bitte")
            stdwas = input('Welche Information wollen Sie eintragen? (Fach, Raum oder Lehrer?) ').title()
            inf = input('Was soll eingetragen werden?(Maximal 4 Zeichen) ')[:4].ljust(4)
            week.aendern(wochewas,tagwas,stdwas,inf)
        elif eingabe in ['a']:
            week.anzeigen()
            
        elif eingabe in ['r']:
            week.raum()
            
        elif eingabe in ['b']:
            while True:
                was=input("Welchen Tag wollen sie anzeigen lassen ? (Nur Zahlen bitte !")
                try:
                    was=int(was)
                    break
                except ValueError:
                    print("Nur Zahlen eingeben bitte!")
            week.tage[was-1].anzeigen()
            
        elif eingabe in ['f']:
            while True:
                was=input("Von welchem Tag wollen sie den Raumplan anzeigen lassen ?(Nur Zahlen bittte!)")
                try:
                    was=int(was)
                    break
                except ValueError:
                    print("Nur Zahlen bitte!")
            week.tage[was-1].raum()
            
        elif eingabe in["e"]:
                warten=input('Bitte nochmal Enter drücken! ')
                week.speichern()
                time.sleep(1)
                print("Auf Wiedersehen!")
                #sys.exit(0)
                #os._exit(0)
                break
            
        elif eingabe in ['s']:
            week.speichern()
            
        elif eingabe in ['l']:
            pfad=os.path.dirname(sys.argv[0])
            echterpfad=os.path.join(pfad,"datas","data")
            try:
                with open(echterpfad,"rb") as file:
                    weekdata=pickle.load(file)
                    week.geladene_daten_annehmen(weekdata)
            except FileNotFoundError:
                print("Keine Daten gefunden")
                
        else :
            print("Bitte ein Buchstaben aus den Klammern oben wählen!")
        

print("Ihr Stundenplaner wurde geladen!")

if __name__ == '__main__':
    
    main()
Anfänger in den Kinderschuhen aber bestrebt besser zu werden ():O
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Nachdem ich jetzt zum gefühlt hundertsten Mal den fürchterlichen Codewust vor mir sehe:
  1. Bitte lies, verstehe und beherzige den Style Guide for Python Code
  2. Nimm endlich diese unsäglichen überflüssigen Leerzeilen nach def aus dem Code.
astrionn
User
Beiträge: 43
Registriert: Freitag 28. Februar 2014, 19:20

okay mach ich tut mir leid

mit top-level function ist bei mir nur main() gemeint oder ?
To avoid name clashes with subclasses, use two leading underscores to invoke Python's name mangling rules.
meint an meinem beispiel dass wenn ich eine instanz von stunde() schaffe soll/darf ich sie __stunde nennen ?
Anfänger in den Kinderschuhen aber bestrebt besser zu werden ():O
Antworten