2017-10-08 7 views
2

Je voudrais un utilisateur défini une série de chaînesCréation d'instances différentes dans une boucle en utilisant un dictionnaire

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

qui correspondent à une série d'objets à instancier à partir d'un dictionnaire d'objets possibles

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

Lorsque le correspondent Cat et Cactus à des classes qui descendent d'une classe parente

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

J'essaie d'ajouter le type d'objet à une liste

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

Mais quand je fais l'exception est soulevée en me disant « type pas exist » lorsque la chaîne correspond exactement à l'entrée du dictionnaire! Pourquoi cela arrive-t-il?

Je veux alors utiliser pet_types comme celui-ci

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

Commencez par ne pas utiliser de couverture 'try ... except'. Quelle est l'exception réelle * soulevée? –

+1

Note de côté: ne pas boucler 'range()' quand vous pourriez juste boucler directement 'user_input' directement. –

+0

Je pense que vous cherchez un modèle d'usine. https://en.wikipedia.org/wiki/Factory_method_pattern –

Répondre

3

Attraper exception (except:) est une pratique douteuse, comme se cache l'exception d'origine avec votre propre, sans vous connecter même pas.

La combinaison de ces deux pratiques douteuses dans ce cas, le fait que cachèrent vous avez une faute de frappe, et vous essayez d'accéder à l'pet_type non défini (singulier), au lieu de la variable que vous avez réellement - pet_types (au pluriel). Fixez-le et vous devriez aller bien.

+0

Oui vous avez raison, c'est un peu embarrassant! Cela fonctionne bien et sans l'exception d'être jeté. À l'avenir, je ne vais pas ajouter l'exception personnalisée !! –