2017-10-08 1 views
2

ich einen Benutzer möchte eine Reihe von Strings definiertErstellen von verschiedenen Instanzen in einer Schleife ein Wörterbuch mit

user_input = ('cat', 'cactus', 'cat') 

, die zu einer Reihe von Objekten entsprechen aus einem Wörterbuch der möglichen Objekte instanziiert werden

classes = { 
    'cat': Cat, 
    'cactus': Cactus, 
} 

Wo die Cat und Cactus entsprechen Klassen, die von einer übergeordneten Klasse absteigen

class Pet(): 
    ... 

class Cat(Pet): 
    def __init__(self, name, colour): 
     Pet.__init__(self, name, colour) 
     ... 

class Cactus(Pet): 
    def __init__(self, name, colour): 
     Pet.__init__(self, name, colour) 
     ... 

Ich versuche Objekttyp auf eine Liste

pet_types = [] 
for i in range(0,3): 
    try: 
     pet_type.append(classes[user_input[i]]) 
    except: 
     raise Exception('type no exist') 

Aber hinzufügen, wenn ich dies die Ausnahme tun angehoben sagen mir „kein exist geben“, wenn die Zeichenfolge an den Wörterbucheintrag entspricht genau! Warum passiert dies?

Ich mag dann pet_types wie diese jede Ausnahme Beschäftigte

pet_500 = pet_types[500](name,colour) 
+1

Beginnen Sie, indem Sie keine Decke verwenden "versuchen ... außer". Wie wird die * tatsächliche Ausnahme * ausgelöst? –

+1

Randnotiz: Schleife nicht über 'range()', wenn du nur 'user_input' direkt loopen kannst. –

+0

Ich denke du suchst ein Fabrikmuster. https://en.wikipedia.org/wiki/Factory_method_pattern –

Antwort

3

verwenden (except:) ist eine zweifelhafte Praxis, wie die ursprüngliche Ausnahme mit Ihrem eigenen verstecken, ohne es zu protokollieren.

Die Kombination dieser beiden zwielichtigen Praktiken in diesem Fall versteckte die Tatsache, dass Sie einen Tippfehler haben, und Sie versuchen, den undefinierten pet_type (Singular) zuzugreifen, statt der Variable, die Sie tatsächlich haben - pet_types (Plural). Repariere es und es sollte dir gut gehen.

+0

Ja du bist richtig, das ist ein bisschen peinlich! Es funktioniert gut und ohne Ausnahme wird geworfen. In Zukunft werde ich die benutzerdefinierte Ausnahme nicht hinzufügen !! –

Verwandte Themen