Seite 2 von 3
Re: Hilfe mit json/pickle in python 3+
Verfasst: Donnerstag 15. Januar 2015, 14:10
von 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…
Re: Hilfe mit json/pickle in python 3+
Verfasst: Donnerstag 15. Januar 2015, 14:10
von pillmuncher
astrionn hat geschrieben:ich hab noch ein paar mehr sachen gemacht z.b. start privat gemacht
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.
Re: Hilfe mit json/pickle in python 3+
Verfasst: Donnerstag 15. Januar 2015, 14:15
von Sirius3
@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.
Re: Hilfe mit json/pickle in python 3+
Verfasst: Donnerstag 15. Januar 2015, 16:46
von astrionn
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
Re: Hilfe mit json/pickle in python 3+
Verfasst: Donnerstag 15. Januar 2015, 16:53
von 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.
Re: Hilfe mit json/pickle in python 3+
Verfasst: Donnerstag 15. Januar 2015, 16:57
von astrionn
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 ? ^.^
Re: Hilfe mit json/pickle in python 3+
Verfasst: Donnerstag 15. Januar 2015, 17:07
von /me
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.
Re: Hilfe mit json/pickle in python 3+
Verfasst: Donnerstag 15. Januar 2015, 17:11
von astrionn
@/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 ?
Re: Hilfe mit json/pickle in python 3+
Verfasst: Donnerstag 15. Januar 2015, 17:30
von Sirius3
@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.
Re: Hilfe mit json/pickle in python 3+
Verfasst: Donnerstag 15. Januar 2015, 17:32
von /me
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.
Re: Hilfe mit json/pickle in python 3+
Verfasst: Donnerstag 15. Januar 2015, 17:34
von Hyperion
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
Re: Hilfe mit json/pickle in python 3+
Verfasst: Donnerstag 15. Januar 2015, 17:35
von 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.
Re: Hilfe mit json/pickle in python 3+
Verfasst: Donnerstag 15. Januar 2015, 18:00
von astrionn
@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 ?
Re: Hilfe mit json/pickle in python 3+
Verfasst: Donnerstag 15. Januar 2015, 18:12
von Sirius3
@astrionn: wie oft noch! Gar kein "exit"!
Re: Hilfe mit json/pickle in python 3+
Verfasst: Donnerstag 15. Januar 2015, 18:23
von astrionn
@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()
Re: Hilfe mit json/pickle in python 3+
Verfasst: Donnerstag 15. Januar 2015, 19:23
von 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.
Re: Hilfe mit json/pickle in python 3+
Verfasst: Donnerstag 15. Januar 2015, 20:36
von astrionn
@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
Re: Hilfe mit json/pickle in python 3+
Verfasst: Donnerstag 15. Januar 2015, 22:23
von astrionn
@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()
Re: Hilfe mit json/pickle in python 3+
Verfasst: Donnerstag 15. Januar 2015, 22:28
von /me
Nachdem ich jetzt zum gefühlt hundertsten Mal den fürchterlichen Codewust vor mir sehe:
- Bitte lies, verstehe und beherzige den Style Guide for Python Code
- Nimm endlich diese unsäglichen überflüssigen Leerzeilen nach def aus dem Code.
Re: Hilfe mit json/pickle in python 3+
Verfasst: Donnerstag 15. Januar 2015, 22:31
von astrionn
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 ?