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.
astrionn
User
Beiträge: 43
Registriert: Freitag 28. Februar 2014, 19:20

so hab weiter gestylt und anzeigen() von woche() geändert ich glaube bis auf stunde/tag 0 beim input muss ich nix mehr abfangen oder ? freue mich über feedback bzgl des stils :) hab außerdem noch json import rausgenommen

Code: Alles auswählen

# -*- coding: UTF8 -*-
#!/usr/bin/env python3
import os
import platform
import sys
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):
            Wochentage = ("Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag")
            print(Wochentage[idx-1],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
BlackJack

@astrionn: Das mit den führenden __ bezieht sich auf Attribute. Verwende die einfach gar nicht. Bis Du tatsächlich mal Mehrfachvererbung und dadurch eine Namenskollision hast. Noch ein Tipp zu Mehrfachvererbung: Verwende die am besten gar nicht.

Eine Exemplar von der Klasse `stunde` würde man `stunde` nennen. Was kein Problem ist wenn man sich an PEP8 halten würde und die Klasse nicht `stunde` sondern `Stunde` nennen würde.
Sirius3
User
Beiträge: 18265
Registriert: Sonntag 21. Oktober 2012, 17:20

@astrionn: Du machst immer genau das Gegenteil, von dem, was man dir rät? Du sollst die Leerzeilen am Anfang jeder Funktion löschen und nicht konsequent überall welche einfügen. Statt pickle zu verwenden, haben wir Dir json empfohlen (bei Pickle brauchst Du im Überigen gar keine eigenen Lade/Speicher-Methoden). Das mit dem Vergleich ob etwas in einer einelementigen Liste ist, wurde auch schon angesprochen ...
astrionn
User
Beiträge: 43
Registriert: Freitag 28. Februar 2014, 19:20

@BlackJack dnake ich habs geändert wusste es nicht besser

@Sirius3 ich habe mich für pickle entschieden da ich das mit json irgendwie nicht hinbekommen habe und ich glaube auch irgendwo eine Empfehlung für pickle bekommen habe außerdem scheint es ja zu funktionieren ich glaube ich habe viel gravierende Fehler als das nicht optimale Modul zu nehmen oder ?
und wegen der Leerzeilen ich habe mich dort (glaube ich ) an PEP8 gehalten ... zumindest laut dies Website : http://pep8online.com/
ich habe alles was dort stand an meinem Code verändert bis auf zu lange Zeilen (was ich aber noch ändern werde) und das Blockkommentare mit # beginnen sollen (auch wenn ich kein Plan hab was das heißt ^^ ) schau dir doch bitte an ob ich das richtig verstanden habe und ob ich nun noch Zeilen rausnehmen soll.

Code: Alles auswählen

# -*- coding: UTF8 -*-
#!/usr/bin/env python3
import os
import platform
import sys
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):
            stunde = Stunde()
            self.stunden.append(stunde)
            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:
                stunde = Stunde()
                stunde.geladene_daten_annehmen(j)
                self.stunden.append(stunde)
            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):
                tag = Tag()
                self.tage.append(tag)
                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):
            Wochentage = ("Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag")
            print(Wochentage[idx-1], 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 = []
                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):
            tag = Tag()
            self.tage.append(tag)
            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

astrionn hat geschrieben:

Code: Alles auswählen

[...]
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 = {}
[...]
Anscheinend müssen wir es explizit am Beispiel erklären.

Code: Alles auswählen

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

    def __init__(self):
        """Konstruktor : Erschafft eine stunde mit einem leeren Wörterbuch"""
        self.daten = {}
Mal abgesehen davon, dass die Docstrings noch nicht schön sind und zum Teil falschen Inhalt haben (__init__ ist kein Konstruktor) hat sich das durch das Herausnehmen der überflüssigen Zeilen schon mal deutlich verbessert.
astrionn
User
Beiträge: 43
Registriert: Freitag 28. Februar 2014, 19:20

@/me etwa so ?

Code: Alles auswählen

# -*- coding: UTF8 -*-
#!/usr/bin/env python3
import os
import platform
import sys
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):
            stunde = Stunde()
            self.stunden.append(stunde)
            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:
                stunde = Stunde()
                stunde.geladene_daten_annehmen(j)
                self.stunden.append(stunde)
            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):
                tag = Tag()
                self.tage.append(tag)
                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):
            Wochentage = ("Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag")
            print(Wochentage[idx-1], 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 = []
                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):
            tag = Tag()
            self.tage.append(tag)
            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
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Da gibt es noch sehr viel zu verbessern:

- Die unnötigen Kommentare zusätzlich zu den Docstrings gehören da nicht hin, da steht ja noch einmal genau das selbe.
- Warum steht bei allen Docstrings vorher "Methode" oder "Private Methode"? Das sieht man doch, das ist vollkommen offensichtlich.
- __init__ ist kein Konstruktor
- Warum initialisierst du in Ziele 24 mit leeren Strings? Für etwas ist der None-Wert gedacht. Außerdem lässt sich ein String aus n Leerzeichen viel einfacher mittels ``" "*n`` erzeugen.
- Bei jedem Except musst du genau angeben, welche Ausnahmen du behandeln möchtest. Andernfalls fängst du wirklich alle Ausnahmen ab und verdeckst damit möglicherweise Programmierfehler und versetzt dein Programm in einen ungültigen Zustand.
- Benutze vernünftige Namen. "was" und "information" sagen gar nichts aus.
- Du vermische Eingabe/Ausgabe und Verarbeitung, das sollte von einander getrennt sein, damit die Funktionalität vernünftig getestet werden kann.
- Kommentare wie in Zeile 37 sind unnütz. Die sollen nicht die Befehle in Worten noch einmal beschreiben, sondern einen zusätzlichen Nutzen liefern. Es ist doch ganz offensichtlich, dass da die Daten ausgegeben werden.
- "zu_speichernde_daten_ausgeben" gibt überhaupt nichts aus. Die Methode ist an sich total unnütz und sollte so gar nicht existieren. Der Name wirkt außerdem sehr seltsam
- Selbiges gilt für "geladene_daten_annehmen". Die Funktion ist wieder überflüssig, da kann man auch direkt eine Zuweisung machen. Und das except ist einfach nur falsch, da kann gar kein Fehler auftreten.
- Bei der raum-Methode würde ich nicht erwarten, dass ein Raum ausgegeben wird.
- Du solltest mit Konstanten Arbeiten, dass musst du auch nicht überall "Raum" als Strings in den Code schreiben.
- Der Kommentar in Zeile 67 ist wieder total unnötig, das beschreibt offensichtliches
- Wo kommt die 11 in Zeile 76 her? Du wirst es nicht glauben, aber bei solchen Zahlen weiß man im eigenen Quellcode häufig schon nach wenigen Wochen nicht mehr, was diese überhaupt bedeuten. Definiere dir dafür eine Konstante mit einem eindeutigen Namen.
- Der Kommentar in Zeile 82 beschreibt wieder offensichtliches. Eine Zeile sollte übrigens nicht länger als 80 Zeichen sein, dann solltest du umbrechen. Gerade mit Docstrings geht das ja sehr gut, denn dafür sind sie gedacht.
- "tagwas" hat keinen Informationsgehalt und das except fängt wieder viel zu viel ab.
- Der Name "aendern" ist viel zu generisch. *Was* wird geändert ist die wichtige Information, nicht dass etwas geändert wird.
- "zu_speichernde_daten_ausgeben" gibt wieder nichts aus, die Zeilen sind zu lang und der Name falsch.
- "datas" kannst du auch gleich zurückgeben, dass musst du nicht an einen Namen binden
- "data" ist bereits ein Plural, "datas" macht keinen Sinn. Außerdem ist der Name wieder zu generisch. *Was* für Daten ist wichtig.
- "geladenen_daten_annehmen" ist wieder ein seltsamer Name, sonst hat die Methode die selben Probleme wie die davor.
- "j" ist ein schlechter Name für ein Objekt. Da erwartet jeder einen Integer. Was für Elemente stecken denn in "data" drin?
- Die 11 sollte natürlich wieder eine Konstante sein.
- Was macht die "raum"-Methode?
- Ein sehr seltsame Pfad wird in Zeile 130 generiert.
- "ladedatei" ist wieder ein schlechter Name. Was steckt in der Datei drin?
- Das Öffnen einer Datei kann schiefgehen, du bekommst dann eine IOException. Die solltest du behandeln.
- Zu testen, ob eine Datei existiert, ist unnötig. Versuche sie einfach zu öffnen. Wenn das nicht geht, dann kannst du noch immer versuchen das Problem zu behandeln.
- Der 5 in Zeile 137 solltest du eine Konstante spendieren. Die lässt sich wahrscheinlich aus den Wochentagen ableiten.
- Zeile 140 ist unnötig Kompliziert. ``tag._start()`` macht genau das selbe.
- "aendern" ist wieder viel zu generisch.
- Die "-1" in Zeiel 145 taucht einfach magisch auf, das führt früher oder später zu Fehlern. Die Namen sind wieder schlecht gewählt und das Except fängt zu viel ab,
- Die Schleife in Zeile 150 ist einfach nur seltsam. Die Wochentage gehören irgendwo als Konstanten ins Modul, den Tag und den Wochentag kannst du mit der zip-Funktion verknüpfen. Das enumerate ist hier unnötig.
- Die speichern-Methode ist verkehrt. Da kann irgendwo etwas schief gehen und du behauptest dann, dass das Betriebssystem das nicht unterstützen würde.
- Die Namen sind in der Methode alle total nichtssagend.
- i und j sollten nur Integer sein, alles andere is unerwartet.
- Wenn du bei deiner Nummerierung mit 0 anfangen würdest, dann hättest du nicht die ganzen Sonderfälle beim enumerate und den Indexzugriffen.
- Entscheide dich für deutsche oder englische Namen, aber nicht beides gemischt.
- In der main-Funktion ist sehr viel Code doppelt, lager das in eine Funktion aus.
- Die man-Funktion ist viel zu lang. Eine Funktion sollte locker auf eine Bildschirmseite passen.
Das Leben ist wie ein Tennisball.
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

astrionn hat geschrieben:

Code: Alles auswählen

    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")
Wozu ein Kommentar der der den gleichen Inhalt hat wie der Docstring?
Wozu das Leerzeichen vor dem Code?
Warum ein except ohne Angabe des zu erwartenden Fehlers?
Welchen Fehler würdest du da überhaupt erwarten?

Der Docstring ist inhaltlich nicht schön, aber das lassen wir jetzt mal. Das Resultat sieht dann so aus:

Code: Alles auswählen

    def geladene_daten_annehmen(self, data):
        """Methode: Setzt self.daten auf data welches als dict übergeben wird"""
        self.daten = data
Jetzt stellt man auch noch fest, dass die Methode eigentlich völlig überflüssig ist. Das Attribut daten kann man auch problemlos ohne die Methode setzen.

Übrig bleibt Folgendes:
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

/me hat geschrieben:Übrig bleibt Folgendes:
Oh nein, nicht noch eine Leerzeile :mrgreen:
Zuletzt geändert von EyDu am Freitag 16. Januar 2015, 18:24, insgesamt 1-mal geändert.
Das Leben ist wie ein Tennisball.
astrionn
User
Beiträge: 43
Registriert: Freitag 28. Februar 2014, 19:20

okay danke erstmal für den ganzen input ich werde mich demnächst darum kümmern und dann wieder fragen :) grade für die hinweise zur programmlogik sind sehr hilfreich danke !
mit der zip methode kenn ich mich nicht aus also bitte anfängliche Ausrutscher verzeihen :)

hier nochmal die frage nach einer Veränderung des Interpreters(? also IDLE) um die Zeilennummer anzuzeigen oder nach einem Alternativinterpreter(?) der diese Funktion mitbringt ohne viel vom Layout zu verlieren .
Anfänger in den Kinderschuhen aber bestrebt besser zu werden ():O
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

IDLE ist nicht der Interpreter, IDLE ist eine IDE. Damit hast du auch gleich einen Suchbegriff, mit dem du das Forum durchsuchen kannst. Dazu gibt es einen ellenlangen Thread. Für Python reicht eigentlich ein einfacher Editor.
Das Leben ist wie ein Tennisball.
astrionn
User
Beiträge: 43
Registriert: Freitag 28. Februar 2014, 19:20

@EyDu okay danke schau ich mir mal an
Anfänger in den Kinderschuhen aber bestrebt besser zu werden ():O
Antworten