Einstellungen in Datei speichern & importieren

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.
Benutzeravatar
Michael Schneider
User
Beiträge: 567
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Bremen
Kontaktdaten:

Donnerstag 21. Januar 2010, 23:09

cofi hat geschrieben:
Michael Schneider hat geschrieben:
jbs hat geschrieben:Ein generelles Except fängt auch sachen wie KeyboardInterrupt ab, weshalb das nicht zu empfehlen ist.
Ok, und wo ist das Problem?
Und natuerlich noch `SystemExit`.
Das Problem sollte offensichtlich sein: Es faengt eben nicht nur "eigentliche" Exceptions ab, sondern alles, das ueber Exceptions implementiert wurde. Besser ist `except Exception`.
Du widerlegst Dich gerade selbst.
'except Exception' fängt eben nicht alle Exceptions ab. Das kann aber zweckmäßig sein, wenn man z.B. einen Prozess sicher abschließen und nicht durch eine strg+c abbrechen lassen will. Es ist nicht immer sinnvoll, aber es kategorisch auszuschließen finde ich ein wenig übertrieben.

Wie oben gesagt: es kommt darauf an, wie die gefangene Ausnahme dann verarbeitet wird.

VG,
Michel
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Benutzeravatar
cofi
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Donnerstag 21. Januar 2010, 23:40

Michael Schneider hat geschrieben: Du widerlegst Dich gerade selbst.
'except Exception' fängt eben nicht alle Exceptions ab.
Das tue ich nicht, denn genau das habe ich gesagt. Und genau das ist der Grund, warum man das bevorzugen sollte.
cofi hat geschrieben:Es faengt eben nicht nur "eigentliche" Exceptions ab, sondern alles, das ueber Exceptions implementiert wurde.
War aber zugegeben etwas verwirrend.

Wenn man das Verhalten, dass du beschreibst erreichen will ist immernoch `except BaseException` besser, da es genau dokumentiert, dass das Absicht is. Darauf kann man bei einem blanken `except` eben nicht schliessen. (Ist allerdings auch etwas neuer.)
Benutzeravatar
Michael Schneider
User
Beiträge: 567
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Bremen
Kontaktdaten:

Freitag 22. Januar 2010, 08:17

cofi hat geschrieben:
Michael Schneider hat geschrieben: Du widerlegst Dich gerade selbst.
'except Exception' fängt eben nicht alle Exceptions ab.
Das tue ich nicht, denn genau das habe ich gesagt. Und genau das ist der Grund, warum man das bevorzugen sollte.
Tust Du wohl, denn mein Beispiel sagte "alles abfangen, egal was es ist". Du antwortetest mit "except Exception" und schreibst dazu, dass es einige Exceptions nicht abfängt. :-)
cofi hat geschrieben:Wenn man das Verhalten, dass du beschreibst erreichen will ist immernoch `except BaseException` besser, da es genau dokumentiert, dass das Absicht is. Darauf kann man bei einem blanken `except` eben nicht schliessen. (Ist allerdings auch etwas neuer.)
Siehst Du, wieder was gelernt. :-) Die gibt es seit 2.5, hätte ich also durchaus kennen können/sollen. :D

Wobei das auch nur funktioniert, solange man keine eigenen Exceptions wirft, die nicht mit BaseException verwandt sind...

VG,
Michel
Diese Nachricht zersört sich in 5 Sekunden selbst ...
heiliga horsd

Freitag 22. Januar 2010, 15:42

Also, ich habe jetzt folgende Funktionen:

Code: Alles auswählen

def Schreiben(a,b):
    config = configparser.RawConfigParser()
    config.add_section('Programm-Settings')
    config.set('Programm-Settings', 'Ausgabedatei', b)
    config.set('Programm-Settings', 'Dezimalzahl', a)
    with open('Programm-Einstellungen.cfg', 'a') as configfile:
        config.write(configfile)

Code: Alles auswählen

def Lesen():
    config = configparser.RawConfigParser()
    config.read('Pogramm-Einstellungen.cfg')
    global Dezimalzahl
    Dezimalzahl = config.getint('Programm-Settings', 'Dezimalzahl')
    global Ausgabedatei
    Ausgabedatei = config.get('Programm-Settings', 'Ausgabedatei')
Nun soll folgende Funktion den Wert für die Genauigkeit verwenden:

Code: Alles auswählen

def KatheteBerechnen (): #Funktion berechnet Kathetenlaenge
    #Variablen: b: Kathete, c: Hypotenuse, a: errechnete Kathete
    Lesen()
    if Dezimalzahl == -1:
        Dezimalzahl = int(input ("Genauigkeit in Nachkommastellen: "))
        if Dezimalzahl < 0:
            print ("Die Nachkommastellenanzahl muss größer oder gleich 0 sein")
            return
        elif Dezimalzahl >100:
            print ("maximal 100 Nachkommastellen")
            return
    b = Decimal(str(locale.atof(input ("Kathetenlaenge:  "))))
    if NullCheck (b):
        return
    c = Decimal(str(locale.atof(input ("Hypotenusenlaenge: "))))
    if NullCheck (c):
        return
    if c <= b:
        print ("Hypotenusenlaenge kleiner als Kathetelaenge, Abbruch")
        return
    a = ((c*c)-(b*b)).sqrt().quantize(getcontext().power(Decimal('10.0'), -1 * Dezimalzahl))
Leider bekomme ich dauernd:
UnboundLocalError: local variable 'Dezimalzahl' referenced before assignment
Nun meine Fragen:
a) was mache ich falsch bzw. wie müsste das erfolgreiche auslesen aussehen?
b) wie kann ich beim configparser default-variablen setzen? (und wie überprüfe ich dann später in der funktion auf die default-variable?)
c) Tipps von eurer Seite?


Das mit den exceptions bei der Eingabe von Daten hab ich jetzt noch nicht dazugeschrieben, war mir bisher noch zu viel Arbeit ;-)
Zuletzt geändert von heiliga horsd am Freitag 22. Januar 2010, 18:00, insgesamt 1-mal geändert.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Freitag 22. Januar 2010, 15:49

heiliga horsd hat geschrieben: Nun meine Fragen:
a) was mache ich falsch bzw. wie müsste das erfolgreiche auslesen aussehen?
Du musst die Objekte auch außerhalb Deiner "Lesen()"-Funktion verfügbar machen!

Code: Alles auswählen

def get_params():
    bar = 5
    return bar

def foo(param):
    # mache was mit dem parameter
    print param

def main():
    param = get_params()
    foo(param)
überprüfe ich dann später in der funktion auf die default-variable?)
c) Tipps von eurer Seite?
PEP8 beachten!
heiliga horsd

Freitag 22. Januar 2010, 18:18

Danke dir!

Also wenn ich bspw.

Code: Alles auswählen

def blabla:
    [...]
    return Dezimalzahl
    [...]
habe, kann ich mit

Code: Alles auswählen

def lalala:
    [...]
    Dezimalzahl = blabla()
    [...]
darauf zugreifen?

Muss ich dann irgendwas beachten, wenn ich zwei Werte zurück gebe und bloß einen verwende oder ist das egal?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Freitag 22. Januar 2010, 18:30

Du kannst mehrere Werte zurückgeben, ja. Du erhältst dann ein Tupel zurück.

Code: Alles auswählen

def foo():
    return True, None, 4, "Hallo"
Du solltest Dir dringend mal das Tutorial angucken. Das sind absolute Grundlagen und ohne diese kann Deine Projektstruktur nicht gut sein! (Du verwendest doch Funktionen - da sollte man so etwas banales doch wissen)
heiliga horsd

Freitag 22. Januar 2010, 18:39

Ich weiß schon, dass ich mehrere Werte zurück geben kann (und auch wie). Ich wollte lediglich wissen, was passiert, wenn ich mehr Werte zurück gebe, als ich dann eigentlich brauche.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Freitag 22. Januar 2010, 19:11

heiliga horsd hat geschrieben:Ich weiß schon, dass ich mehrere Werte zurück geben kann (und auch wie). Ich wollte lediglich wissen, was passiert, wenn ich mehr Werte zurück gebe, als ich dann eigentlich brauche.
Dann hättest Du das auch schreiben sollen ;-)

"Versuch macht kluch"

Code: Alles auswählen

In [1]: def foo():
   ...:     return 1, True, None, "Hallo"
   ...:

In [2]: foo()
Out[2]: (1, True, None, 'Hallo')

In [3]: d = foo()

In [4]: d[0]
Out[4]: 1

In [5]: d[3]
Out[5]: 'Hallo'

In [6]: a, b, c = foo()
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)

C:\Dokumente und Einstellungen\nelson\Eigene Dateien\<ipython console> in <modul
e>()

ValueError: too many values to unpack
Wie Du siehst ist es solange egal, wie Du das Tupel nicht wieder zerlegen und an einzelne Namen binden willst. Dann muss die Anzahl natürlich exakt stimmen.
Benutzeravatar
Michael Schneider
User
Beiträge: 567
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Bremen
Kontaktdaten:

Freitag 22. Januar 2010, 20:28

Hallo,

um nochmal eine manchmal verwirrende Eigenheit zu erläutern, auch wenn es nicht 1 zu 1 auf Dein Beispiel zutrifft:

Code: Alles auswählen

>>> i = 5
>>> def out():
...   print i
...   i = 3
...
>>> out()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in out
UnboundLocalError: local variable 'i' referenced before assignment
Im Beispiel ist der Name i global an das Integerobjekt 5 gebunden.
Theoretisch kannst Du das Objekt innerhalb der Funktion referenzieren. ABER: wenn Du im weiteren Verlauf der Funktion den Namen neu bindest, wie in diesem Fall an das Integerobjekt der 3, dann gilt der Name (quasi rückwirkend) als lokal. Daher ist der Zugriff wie oben dargestellt nicht möglich. Lösung wäre eine Definition als 'global i' (unschön) oder die Übergabe als Funktionsparameter von außen (sauber).

Ich hoffe, das war verständlich. :-)

Grüße,
Michel
Diese Nachricht zersört sich in 5 Sekunden selbst ...
heiliga horsd

Freitag 22. Januar 2010, 20:33

Ja, war es. Ich werde mich wahrscheinlich morgen nochmal dran setzen und wieder ein wenig herum tüfteln. Falls wieder Fragen aufkommen melde ich mich.

Bis dahin Danke an alle!
Antworten