Seite 1 von 1

kleine if -Abfrage mit drei Optionen elegant gestalten?!

Verfasst: Dienstag 24. Februar 2009, 10:10
von christine
Hallo,

ich möchte eine Abfrage gestalten die etwas tut, wenn die Eingabe entweder 2007, 2008 oder 2009 entspricht.

Alles was mir einfällt ist sehr umständlich (elif, elif...?!)

datumsabfrage = ['2007', '2008', '2009']
if abfrageErgebnis == datumsabfrage[0]:
print "OK"

-> kann man das schöner machen?!
Danke, Grüße,
Christine

Verfasst: Dienstag 24. Februar 2009, 10:14
von Panke

Code: Alles auswählen

if wert in [2007, 2008, 2009]:
    pass
if 2007 <= wert <= 2009:
    pass
[/code]

Verfasst: Dienstag 24. Februar 2009, 10:19
von numerix
Hallo christine, willkommen im Forum!

Ich sehe einen Widerspruch zwischen deiner Problembeschreibung und dem Code. Meinst du so etwas?

Code: Alles auswählen

if jahr in [2007, 2008, 2009]:
    print "jahr ist drin"
Falls sicher ist, dass jahr ganzzahlig ist, ginge auch:

Code: Alles auswählen

if 2006 < jahr < 2010:
    print "jahr ist drin"
Oder ist es das:

Code: Alles auswählen

if jahr == 2007:
    print "2007"
elif jahr == 2008:
    print "2008"
elif jahr == 2009:
    print "2009"
else:
    print "nix"
Dann hängt es davon ab, was du im Anweisungsblock vorhast. Auf jeden Fall ließe sich das durch ein dictionary ersetzen. Ob sich das bei drei zu unterscheidenden Möglichkeiten schon lohnt, ist Geschmackssache.

Verfasst: Dienstag 24. Februar 2009, 10:32
von christine
Hey,

vielen Dank für die schnellen Antworten.
Ich währe z.B.: nicht darauf gekommen die Liste direkt in die Abfrage zu
setzen.
Hab auch schon mit Regulären Ausdrücken usw rumprobiert...

mercy 8)

Verfasst: Mittwoch 25. Februar 2009, 16:36
von sma
Manchmal ist es aus sinnvoll, direkt oder indirekt über Directory-Objekte zu dispatchen. Dieses Beispiel passt nicht direkt auf die Aufgabe mit den drei Daten, aber mir war gerade danach :)

Code: Alles auswählen

class Foo:
    def a(self): print "A"
    def b(self): print "B"
    def c(self): print "C"
    
    def dispatch(self, code): getattr(self, code)()

Foo().dispatch("a")
Stefan

Verfasst: Donnerstag 26. Februar 2009, 14:37
von EyDu
Ach, da geht noch einiges ... ^^

Code: Alles auswählen

import functools

def dispatchable(name):
    def marker(func):
        func.dispatch_name = name
        return func

    return marker


class NotDispatchable(Exception):
    pass


class DispatchableMeta(type):
    def __init__(cls, name, bases, dct):
        type.__init__(cls, name, bases, dct)
        
        def disp(self, name):
            try:
                return functools.partial(self.dispatchables[name], self)
            except KeyError:
                raise NotDispatchable()
        
        dispatchables = {}
        
        for value in dct.itervalues():
            try:
                dispatchables[value.dispatch_name] = value
            except AttributeError:
                pass

        try:
            old = cls.dispatchables
        except AttributeError:
            old = {}
        
        cls.dispatchables = dispatchables
        for key, value in old.iteritems():
            if key not in cls.dispatchables:
                dispatchables[key] = value
        
        cls.dispatch = disp



class Spam:
    __metaclass__ = DispatchableMeta

    @dispatchable("eggs")
    def la_function(self):
        print "eggs"

test = Spam()
test.dispatch("eggs")()

Verfasst: Freitag 27. Februar 2009, 18:46
von birkenfeld
Noch ein paar mehr Features, und du kannst es als Teil von PEAK veröffentlichen...

Verfasst: Freitag 27. Februar 2009, 20:33
von wuf
Hallo christine

Hier noch zwei abstrakte Varianten:

Code: Alles auswählen

year = '2007'

year_check = {
    '2007': True,
    '2008': True,
    '2009': True
    }.get(year, False)

print "Jahr-Check", year_check

Code: Alles auswählen

def year_checker(year):
    return {
        '2007': True,
        '2008': True,
        '2009': True
        }.get(year, False)

year = '2007'
print "Jahr-Check", year_checker(year)
Gruss wuf :wink: