2011-10-05 3 views
0

Je connais la syntaxe C# pour, par exemple, créer une liste de chaînes par List<string> MyList.Création de listes "typées" en Python 2.5

Y a-t-il une syntaxe similaire dans Python qui l'empêchera de fonctionner si j'essaie d'ajouter un type qui n'est pas dans le type de collection?

+0

Vous devez créer une classe personnalisée. Cette fonctionnalité n'existe pas dans Python – NullUserException

+0

Ce n'est pas la manière Python. Si cela doit être utilisé en interne dans votre code, ne mettez rien d'autre que des chaînes dans la liste. Si cela doit être exposé aux utilisateurs d'un module que vous écrivez, documentez-le correctement. De cette façon, la liste peut contenir tout ce qui se comporte comme une chaîne mais n'est pas nécessairement une chaîne. Voir "Dactylographie" et EAFP pour plus d'informations. – yak

Répondre

1

Comme d'autres l'ont dit, Python n'a pas quelque chose comme ça construit.

Si vous voulez faire quelque chose comme ça, vous sous-classe le haut-list() classe, et faire toutes les méthodes qui permettent l'insertion ou l'ajout d'éléments effectue une vérification de type. Ou, au lieu de la vérification de type, vous pouvez faire en sorte que vos méthodes personnalisées essaient de contraindre le type.

Voici un exemple d'implémentation d'une liste qui ne contiendra que des valeurs int(). Il va forcer tout ce que vous essayez d'insérer ou d'ajouter dedans, et déclencher une erreur appropriée. J'ai sous-classé le type intégré list(), donc le code que j'ai écrit est juste les exceptions; tout ce que vous ne voyez pas ici fonctionnera exactement comme le type de base list(). J'avais juste besoin d'accrocher quelques méthodes. Je lui ai également donné une méthode personnalisée .__init__() qui accepte une liste ou une autre séquence et initialise l'objet.

Ceci est une implémentation incomplète; par exemple, il ne remplace pas la méthode .insert(). Mais je pense que cela vous montre l'idée de base, et si vous voulez vraiment une classe IntList(), vous pouvez l'utiliser comme base.

class IntList(list): 
    def __init__(self, seq=None): 
     if seq is not None: 
      try: 
       for x in seq: 
        self.append(int(x)) 
      except ValueError: 
       raise ValueError, "can only use int values to init IntList" 
    def __setitem__(self, i, x): 
     try: 
      list.__setitem__(self, i, int(x)) 
     except ValueError: 
      raise ValueError, "can only set int values into IntList" 
    def append(self, x): 
     try: 
      list.append(self, int(x)) 
     except ValueError: 
      raise ValueError, "can only append int values to IntList" 


lst = [0, 1, 't'] 

try: 
    o = IntList(lst) # raises exception 
except ValueError: 
    print("lst has a 't' in it") 

o = IntList(range(3)) # works 

try: 
    o[1] = 't' 
except ValueError: 
    print("cannot set to 't'") 

o[1] = 2 # works 

o.append(4) # works 
o.append('t') # raises error 

Les impressions ci-dessus:

lst has a 't' in it 
cannot set to 't' 
Traceback (most recent call last): 
    File "t.py", line 38, in <module> 
    o.append('t') # raises error 
    File "t.py", line 18, in append 
    raise ValueError, "can only append int values to IntList" 
ValueError: can only append int values to IntList 

Il y a un langage Python commun d'avoir un argument par défaut à None pour les arguments de liste dans .__init__() fonctions. En effet, la liste de valeurs par défaut n'est évaluée qu'une seule fois, au moment de la compilation, et l'enregistrement d'une référence à cette liste signifie que chaque instance de la classe partage la même instance. Dans ce cas, puisque nous avons une boucle for itérant sur la boucle, en construisant notre propre copie, je n'ai pas vraiment besoin de faire cette idiome; mais je voulais donner un exemple de l'idiome pour le bénéfice des débutants en lisant ceci.

1

Non. Vous devrez créer une classe personnalisée qui implémente le __*item__() methods de manière appropriée.

+0

Je suis encore un apprenti python, avez-vous des exemples d'utilisation des méthodes __ * item __() en action? (en particulier en utilisant python 2.5 depuis que je travaille sur google app engine) –

+0

Essayez de cliquer sur le mot "méthodes" dans la réponse ci-dessus. C'est un lien vers une page de documentation Python. – steveha