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.
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