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.
Vous devez créer une classe personnalisée. Cette fonctionnalité n'existe pas dans Python – NullUserException
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