Gehts eleganter?

23/02/2008 - 01:55 von Marco Kittel | Report spam
Hallo,

Ich hab nen kleines Programm geschrieben, mit dem ich per Console
meine ganzen Kontogeschichten speichern will. Was anderes ist mir
für den Anfang nicht eingefallen. Also eigentlich gute Übung. Allerdings
frage ich mich, ob es nicht hier und da eleganter geht. Gibts eine
möglichkeit das Home Directory unter Linux zu ermitteln? Ich will das
Programm nàmlich in /usr/bin packen, allerdings, will ich nicht dass meine
Datensatz in diesem Dir abgelegt werden, daher möchte ich gern
eine Möglichkeit implementieren, dass das Programm im User dir vom Bentuzer
ein verstecktes Verzeichnis erstellt mit entsprechender Datei.
Guckt mal bitte drüber, und sagt mir was nicht so schön ist. danke



class Transaktion(object):
def __init__(self,produktname='',betrag=0,ausgabe=False):
self.__produkt=produktname
self.__preis=betrag
self.__ausgaben=ausgabe
def produktname(self):
return self.__produkt
def preis(self):
return self.__preis
def ausgabe(self):
return self.__ausgaben


class Container(object):
def __init__(self,liste=False):
if not liste:
self.__liste = list()
#print "erstellt eine leere liste"
else:
#print "nimmt die liste aus der datei"
self.__liste=liste
def anhaengen(self,transaktion_klasse):
self.__liste.append(transaktion_klasse)

def ersetzen(self,transaktion_klasse,position):
self.__liste[position]=transaktion_klasse

def inhalt(self):
return self.__liste

def loeschen(self,p_in_liste):
try:
del self.__liste[p_in_liste]
except :
pass
def zeige_einnahmen(self):
print ' Einnahme\t\t\tBetrag'
for item in range(0,len(self.__liste)):
if self.__liste[item].ausgabe()==False:

print '['+str(item+1)+'] '+self.__liste[item].produktname()+"\t\t\t"+str(self.__liste[item].preis())+"
Euro"

def zeige_ausgaben(self):
print ' Kosten\t\t\tBetrag'
for item in range(0,len(self.__liste)):
if self.__liste[item].ausgabe()==True:

print '['+str(item+1)+'] '+self.__liste[item].produktname()+"\t\t\t"+str(self.__liste[item].preis())+"
Euro"


def make_html(self):
htmldatei=open('/home/leader/Desktop/Cashflow.html','w',0)
daten = ("<html><head><title>Cashflow</title></head><body>
</body>")
pickle.dump(daten,htmldatei)
htmldatei.close() <<- Die Geschichte funktioniert noch gar
nicht

def kosten(self):
kosten = float()
for item in range(0,len(self.__liste)):
if self.__liste[item].ausgabe()==True:
kosten = kosten + self.__liste[item].preis()
# kosten = kosten*(-1)
return kosten

def einnahmen(self):
einnahmen = float()
for item in range(0,len(self.__liste)):
if self.__liste[item].ausgabe()==False:
einnahmen = einnahmen + self.__liste[item].preis()
return einnahmen
def saldo(self):

return self.einnahmen()-self.kosten()



import pickle
from time import strftime
class Backup(object):
def __init__(self,dateiname=''):
self.datei = dateiname


def speichern(self,daten):
self.ausgabe = open(self.datei,'wb')
pickle.dump(daten,self.ausgabe,-1)
self.ausgabe.close()
def laden(self):

self.ausgabe = open(self.datei,'rb')
self.daten = pickle.load(self.ausgabe)
self.ausgabe.close()
return self.daten

def Einnahmen_eingabe(einnahme,betrag,datei):
if Datei_zugriff() == False:

container = Container()
container.anhaengen(Transaktion(einnahme,betrag,False))
datei = Backup(datei)
datei.speichern(container.inhalt())
else:
datei = Backup(datei)
container = Container(datei.laden())
container.anhaengen(Transaktion(einnahme,betrag,False))
datei.speichern(container.inhalt())

def Ausgaben_eingabe(ausgabe,betrag):
if Datei_zugriff() == False:
container = Container()
container.anhaengen(Transaktion(ausgabe,betrag,True))
datei Backup('/home/leader/Desktop/%s.pkl'%strftime("%B%Y"))
datei.speichern(container.inhalt())
else:
datei = Backup('/home/leader/Desktop/%s.pkl'%strftime("%B%Y"))
container = Container(datei.laden())
container.anhaengen(Transaktion(ausgabe,betrag,True))
datei.speichern(container.inhalt())

def Element_loeschen(elementnummer):

#if Datei_zugriff() == True:
# datei = Backup('/home/leader/Desktop/%s.pkl'%strftime("%B%Y"))
container = Container(datei.laden())
container.loeschen(elementnummer-1)
datei = Backup('/home/leader/Desktop/%s.pkl'%strftime("%B%Y"))
datei.speichern(container.inhalt())


def Datei_zugriff():
try:
datei = Backup('/home/leader/Desktop/%s.pkl'%strftime("%B%Y"))
container = Container(datei.laden())
return True
except IOError:
print "%s.pkl existiert nicht"%strftime("%B%Y")
return False





def start():
from optparse import OptionParser
parser = OptionParser()
#parser.add_option("-h", "--help", action="help")
parser.add_option("-d", "--datei",
action="store", type="string",
dest="dateiname",help="öffnet beliebige Datei")
parser.add_option("-l", "--loesche",
action="store", type="int",
dest="loeschen",help="loescht ein Element aus der Liste")
parser.add_option("-p", "--hinzufügen",
action="store", type="string",
dest="hinzufuegen",help="Elemente zur Liste hinzufügen, funzt nur in
Kombination mit -b und -e oder -a")
parser.add_option("-b", "--betrag",
action="store", type="float", dest="betrag")
parser.add_option("-z","--zeige_alles", action="store_true",
dest="zeige_alles")
parser.add_option("-e","--einnahme", action="store_true",
dest="eingabe_oder_ausgabe")
parser.add_option("-a","--ausgabe", action="store_false",
dest="eingabe_oder_ausgabe")
#parser.add_option("--secret", help=SUPPRESS_HELP)
(options, args) = parser.parse_args()

if options.dateiname:
dateiname_fuer_listen_inhalt = options.dateiname
else:
dateiname_fuer_listen_inhalt
= '/home/leader/Desktop/%s.pkl'%strftime("%B%Y")
try:

datei = Backup(dateiname_fuer_listen_inhalt)
container = Container(datei.laden())


if options.zeige_alles:
container.zeige_einnahmen()
#print ''
container.zeige_ausgaben()
print ''

print ' Die Kosten betragen: \t%s Euro' %container.kosten()
print ' Die Einnahmen betragen: \t%s
Euro'%container.einnahmen()
print ' Das Saldo betraegt: \t%s Euro' %container.saldo()

if (options.hinzufuegen and options.betrag and
options.eingabe_oder_ausgabe):

container.anhaengen(Transaktion(options.hinzufuegen,options.betrag,False))
datei.speichern(container.inhalt())


elif (options.hinzufuegen and options.betrag) and not
options.eingabe_oder_ausgabe:

container.anhaengen(Transaktion(options.hinzufuegen,options.betrag,True))
datei.speichern(container.inhalt())


elif (options.hinzufuegen or options.betrag):
print 'Formulierung unvollstàndig'
if options.loeschen:
container.loeschen(options.loeschen-1)
#datei = Backup('/home/leader/Desktop/%s.pkl'%strftime("%B%Y"))
datei.speichern(container.inhalt())

except IOError:
print "%s.pkl existiert nicht"%strftime("%B%Y")


start()
 

Lesen sie die antworten

#1 Thomas Rachel
23/02/2008 - 08:34 | Warnen spam
Marco Kittel schrieb:
Hallo,

Ich hab nen kleines Programm geschrieben,



Einen Programm? Schön...


mit dem ich per Console meine ganzen Kontogeschichten speichern will.
Was anderes ist mir für den Anfang nicht eingefallen. Also eigentlich
gute Übung.



Ja... das hatte ich auch schon immer mal vor, aber nie wirklich realisiert.


Allerdings frage ich mich, ob es nicht hier und da
eleganter geht. Gibts eine möglichkeit das Home Directory unter Linux
zu ermitteln?



Selbstverstàndlich. Mehrere sogar...

import os
os.getenv("HOME")
os.environ['HOME']
os.path.expanduser("~")

Ich will das Programm nàmlich in /usr/bin packen,



Kleiner Tipp, allerdings etwas OffT: Du willstkeine Programme einfach so
nach /usr/bin legen. Entweder ein Paket entsprechend Deines
Paketmanagements bauen oder aber das Programm nach /usr/local/bin legen.


allerdings, will ich nicht dass meine Datensatz in diesem Dir
abgelegt werden,



Kannst Du ja auch gar nicht - es sei denn, Du hast Dein System extremst
verbastelt.

daher möchte ich gern eine Möglichkeit
implementieren, dass das Programm im User dir vom Bentuzer ein
verstecktes Verzeichnis erstellt mit entsprechender Datei. Guckt mal
bitte drüber, und sagt mir was nicht so schön ist. danke



Gerne.


class Transaktion(object):
def __init__(self,produktname='',betrag=0,ausgabe=False):
self.__produkt=produktname
self.__preis=betrag
self.__ausgaben=ausgabe
def produktname(self):
return self.__produkt
def preis(self):
return self.__preis
def ausgabe(self):
return self.__ausgaben



Ich würde die Objektattribute so nennen wie die Parameter des
Konstruktors (__ ist ok), also entweder preis oder betrag.

__ausgaben / ausgabe ist ein Bool-Wert? Dann würde ich die
Getter-Methode eher isAusgabe() oder so nennen, dann sieht man das direkt.

Auch könnte es sinnvoll sein, dieses Feld einzusparen und stattdessen
mit negativem preis() zu arbeiten...


def zeige_einnahmen(self):
print ' Einnahme\t\t\tBetrag'
for item in range(0,len(self.__liste)):
if self.__liste[item].ausgabe()==False:

print '['+str(item+1)+']


'+self.__liste[item].produktname()+"\t\t\t"+str(self.__liste[item].preis())+"
Euro"



schöner:

def zeige_transaktionen(self,ausgaben):
# sicherstellen, daß wirklich True oder False:
ausgaben=not not ausgaben
hdr=(' Kosten\t\t\tBetrag',' Einnahme\t\t\tBetrag')
print hdr[ausgaben]
for nr, item in enumerate(self.__liste):
if not item.ausgabe():
print '[%d]%s\t\t\t%s Euro' % \
(nr,item.produktname(),item.preis())
def zeige_einnahmen(self):
return self.zeige_transaktionen(ausgaben=False)
def zeige_ausgaben(self):
return self.zeige_transaktionen(ausgaben=True)

def make_html(self):
htmldatei=open('/home/leader/Desktop/Cashflow.html','w',0)
daten ("<html><head><title>Cashflow</title></head><body>
</body>")
pickle.dump(daten,htmldatei)
htmldatei.close() <<- Die Geschichte funktioniert


noch gar
nicht



Nie Dateinamen hart reinkodieren, zumindest nicht an dieser Stelle.

Besser:
def make_html(self,fname):
htmldatei=open(fname,'w',0)
...

Was heißt "funktioniert nicht"?


def kosten(self):
kosten = float()



warum nicht kosten= 0 oder kosten = 0.0?


for item in range(0,len(self.__liste)):
if self.__liste[item].ausgabe()==True:
kosten = kosten + self.__liste[item].preis()
# kosten = kosten*(-1)
return kosten



def kosten(self):
return sum(item.preis() for item in self.__liste if item.ausgabe())

ist kürzer :-)


def einnahmen(self):
einnahmen = float()
for item in range(0,len(self.__liste)):
if self.__liste[item].ausgabe()==False:
einnahmen = einnahmen + self.__liste[item].preis()
return einnahmen



return sum(item.preis() for item in self.__liste if not item.ausgabe())


import pickle
from time import strftime
class Backup(object):
def __init__(self,dateiname=''):
self.datei = dateiname



Den Default ='' würde ich hier weglassen - der wàre eh nicht verwendbar.


[snip]

def Einnahmen_eingabe(einnahme,betrag,datei):
if Datei_zugriff() == False:



besser:
if not Datei_zugriff():


if Datei_zugriff() == False:
container = Container()



hier auch


container.anhaengen(Transaktion(ausgabe,betrag,True))
datei > Backup('/home/leader/Desktop/%s.pkl'%strftime("%B%Y"))



Hier kannst Du dann mit

os.path.expanduser('~/Desktop/%s.pkl'%strftime("%B%Y"))

arbeiten.

Und den Dateinamen hast Du etwas oft im Quelltext stehen, besser wàre
eine zentrale Stelle.


try:
datei = Backup('/home/leader/Desktop/%s.pkl'%strftime("%B%Y"))
container = Container(datei.laden())
return True
except IOError:
print "%s.pkl existiert nicht"%strftime("%B%Y")
return False



existiert nicht, ist nicht lesbar, es sind keine Handles mehr frei, oder
was auch immer.


Besser wàre:
except IOError, e:
print "%s.pkl kann nicht geöffnet werden wegen %s"%(strftime("%B%Y"),e)
print "%s.pkl kann nicht geöffnet werden wegen %d
(%s)"%(strftime("%B%Y"),e.errno,e.strerror)

Damit bekommst Du direkt Bescheid, was genau nicht stimmt...









Und Du hast am Dateiende ein paar viele Leerzeilen...


Thomas

Ähnliche fragen