Verbesserungsvorschläge....

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.
rolgal_reloaded
User
Beiträge: 312
Registriert: Dienstag 24. Oktober 2006, 19:31

Code: Alles auswählen

    def get_choice():
        exercise = None
        while not exercise:
            choice = raw_input('Bitte treffen Sie eine Auswahl: ')
            exercise = options.get(choice, None) 
Wofür das None im Methodenaufruf in der letzten Zeile?
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

http://docs.python.org/library/stdtypes.html#dict.get hat geschrieben:If default is not given, it defaults to None
Was willst du uns also damit sagen?
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Hmm, dachte get ist so wie __getitem__ nur mit optionalem Argument.

Naja, explicit ist besser als implicit :)
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

rolgal_reloaded hat geschrieben:Und ob die Funktionen im Dict. besser lesbar sind....da kann ich sie doch frisch ausschreiben, der Zweizeiler ist mir da sympahtischer, oder gibts in deiner Fassung einen wesentlichen Vorteil?
Ich bin eigentlich davon ausgegangen, dass aus "Benutzereingabe" und "nicht in die Berechnungsfunktion" deutlich wird, dass du nicht die Berechnung in Dictionaries packen sollst.

Es läuft im Prinzip auf jbs Vorschlag mit den "options" Hinaus. Auch wenn ich kein inneres Dictionary sondern ein Tupel verwenden würde. Mit Dekoratoren kann man das ganze aber noch schöner gestalten.
Das Leben ist wie ein Tennisball.
rolgal_reloaded
User
Beiträge: 312
Registriert: Dienstag 24. Oktober 2006, 19:31

Erst jetzt habe ich gesehen, dass ich den Code von jbs doch nicht geschnallt habe. Wofür überhaupt options?

LG

r_r

@edit:

ach nee, forget it :D
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

EyDu hat geschrieben:Es läuft im Prinzip auf jbs Vorschlag mit den "options" Hinaus. Auch wenn ich kein inneres Dictionary sondern ein Tupel verwenden würde. Mit Dekoratoren kann man das ganze aber noch schöner gestalten.
Mit Dekoratoren wirds dann doch ganz schön magisch :).

Ich mag Dictionary lieber, da man später noch sieht, was sich nun dahinter verbirgt und es lesbarer wird.
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

rolgal_reloaded hat geschrieben:Erst jetzt habe ich gesehen, dass ich den Code von jbs doch nicht geschnallt habe. Wofür überhaupt options?

LG

r_r

@edit:

ach nee, forget it :D
Ich bündle die Sachen, die zusammen gehören. Jede Aufgabe hat eine Nummer, die auch später dann im Menü auftaucht. Diese ist zugleich der Key. Unter dem Wert verbergen sich dann die Beschreibung, die ich unglücklicherweise auf die Schnelle `str` genannt habe. Vielleicht wäre hier `desc` besser gewesen. Dann bildet ja jede Option im Menü eine Funktion ab, weshalb diese ebenfalls hinzugefügt wird. Dazu kommen noch die Parameter, die benötigt werden. Alternativ könnte man die Funktion untersuchen und schauen, welche Parameter sie benötigt und danach entsprechend fragen. Wenn man es dann noch besser haben möchte, könnte man die Docstrings auswerten, die zuvor noch sinnvoll erstellt werden müssen.

Edit: Man kann mit dem Dictionary schnell neue Funktionen hinzufügen und man hat den Vorteil nicht immer `elif x == y` schreiben zu müssen, sondern man greift einfach auf das Dictionary zu.
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
rolgal_reloaded
User
Beiträge: 312
Registriert: Dienstag 24. Oktober 2006, 19:31

@jbs

Aber dir bleibt es doch nicht erspart die Funktion auszuschreiben - so wie umfang_rechteck, oder?
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Irgendwie muss ich sie ja dispatchen. Die alternative wäre über die Dekoratoren, wie sie EyDu sie vorschlug.


Edit: Mir fällt gerade auf, dass ich den Flächeninhalt berechne, statt dem Umfang :D
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Wo ist denn hier Magie?

Code: Alles auswählen

# -*- coding: utf-8 -*-
class Collection(object):
    def __init__(self):
        self.functions = {}

    def __call__(self, description, output="{0}"):
        def wrapper(function):
            name = function.func_name
            varnames = function.func_code.co_varnames
            argcount = function.func_code.co_argcount
            args = varnames[:argcount]

            self.functions[name] = (function, description, output, args)

            return function

        return wrapper

    def __getitem__(self, name):
        return self.functions[name]


collection = Collection()

@collection("multiplies {1} with {2}", "{1}*{2}={0}")
def mul(a, b):
    return a * b


@collection("squares {1}")
def square(a):
    return a**2


def main():
    while True:
        name = raw_input("function:")
        function, description, output, args = collection[name]
        print '"%s" %s:' % (name, description.format(name, *args))
        params = [float(raw_input("  %s=" % arg)) for arg in args]
        x = function(*params)
        print output.format(x, *params)

if __name__ == "__main__":
    main()

Code: Alles auswählen

function:mul
"mul" multiplies a with b:
  a=2
  b=3
2.0*3.0=6.0
function:square
"square" squares a:
  a=4
16.0
function:
Und dass jetzt keiner mit Vorschlägen kommt wie "hier musst du aber noch eine Exception abfangen...." ;-)

Ich hätte auch noch eine Lösung mit Metaklassen, aber die war nicht so flexibel (man konnte jede Funktion nur einer Sammlung hinzufügen und war an Klassen gebunden).

Sebastian
Zuletzt geändert von EyDu am Dienstag 9. März 2010, 23:42, insgesamt 1-mal geändert.
Das Leben ist wie ein Tennisball.
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

EyDu hat geschrieben:Wo ist denn hier Magie?
Naja, alltäglich ist das nicht. Mein Lehrer ist fasziniert davon ;). Nennt man sowas nicht deklarativ? Weil so imperativ sieht das nicht mehr aus.
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Dann sehen deine und meine Vorstellungen von alltäglichem Code wahrscheinlich anders aus ^^

Es ist übrigens nicht deklarativ. Nur weil es nicht mehr wie eine Katze aussieht, muss es nicht unbedingt ein Wandschrank sein ^^
Das Leben ist wie ein Tennisball.
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Ich würde es immer noch über Docstrings machen ;)
Die deklarative Programmierung ist ein Programmierparadigma, bei dem die Beschreibung des Problems im Vordergrund steht. Der Lösungsweg wird dann automatisch ermittelt.
Du beschreibst die Funktion und lässt den Rest automatisch machen.
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
rolgal_reloaded
User
Beiträge: 312
Registriert: Dienstag 24. Oktober 2006, 19:31

Wenn man so einen Code reinstellt, wäre schon super, wenn man ihn ausführlich kommentiert und erklärt, täten sich die weniger versierten User etwas leichter und könnten was lernen dabei.

Ich versteh es jedenfalls nicht.

LG r_r
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

rolgal_reloaded hat geschrieben:Wenn man so einen Code reinstellt, wäre schon super, wenn man ihn ausführlich kommentiert und erklärt, täten sich die weniger versierten User etwas leichter und könnten was lernen dabei.
Da ist dann die Frage auf welchem Niveau will man einsteigen. Soll man die Funktionsweise erklären? Dekoratoren mit Parametern? Klassen gar?

Wenn du den Code nicht verstehst, steht es dir ja genauso auch frei einfach spezifische Fragen zu stellen die dem Verständnis ggf. mehr helfen als exzessive Kommentare.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten