Comment définissez-vous un conditionnel en python basé sur les types de données?
Cette question semble ahurissant simple, mais je ne peux pas le comprendre. Je sais que vous pouvez vérifier les types de données en python, mais comment pouvez-vous définir un conditionnelle basée sur le type de données? Par exemple, si je dois écrire un code qui trie un dictionnaire/liste et ajoute tous les entiers, comment puis-je isoler la recherche d'recherchez uniquement des entiers?
Je suppose un exemple rapide ressemblerait à quelque chose comme ceci:
y = []
for x in somelist:
if type(x) == <type 'int'>: ### <--- psuedo-code line
y.append(x)
print sum(int(z) for z in y)
Donc pour la ligne 3, comment pourrais-je définir un tel conditionnelle?
- pourquoi est-ce que votre liste d'entiers et non entier éléments? Qu'est-ce que le sujet?
- il n'y a rien qui exige que tous les éléments dans une liste à être du même type.
- McGuire: non, la langue n'est certainement pas à appliquer une fonctionnalité en particulier sur les membres d'une liste en particulier, mais d'un autre côté, le mélange et l'appariement types ensemble dans une commune de la collection suggère peut-être que ces objets ne sont pas aussi étroitement liés que de les mettre dans la même structure de liste pourrait le suggérer. Pourrait-il y avoir une meilleure façon de regrouper ces éléments connexes qu'une seule liste?
Vous devez vous connecter pour publier un commentaire.
Que diriez-vous,
mais d'une façon plus propre serait tout simplement
if type(x) == int
mais pourquoi c'est une mauvaise idée.Il y a vraiment un gros "ça dépend" de la vérification de type Python. Il existe de nombreuses façons de traiter avec des types, et tous ont leurs avantages et leurs inconvénients. Avec Python3, plusieurs ont vu le jour.
Types sont des objets de première classe, et vous pouvez les traiter comme n'importe quelle autre valeur.
Donc, si vous voulez le type de quelque chose pour être égale à
int
, il suffit de tester pour elle:C'est le plus restrictif type de test: il nécessite exacte de l'égalité de traitement. Souvent, ce n'est pas ce que vous voulez:
float
ne serait pas valide, même si elle se comporte comme uneint
à de nombreuses fins.int
sous-classe ouenum
serait rejetée, même si elles sont logiquement Entiers.str
ouunicode
, et les nombres Entiers peuvent être soitint
oulong
.Noter que le type explicite de l'égalité a ses utilisations pour les opérations de bas niveau:
slice
. Une vérification explicite est plus explicite ici.Variantes
Une comparaison peut également être effectuée à l'encontre de la
__class__
attribut:Remarque si une classe définit un
__class__
de la propriété, ce n'est pas le même quetype(x)
.Quand il y a plusieurs classes de vérifier, à l'aide d'un
dict
à l'expédition des actions est plus extensible et peut être plus rapide (≥5 à 10 types) qu'explicite des contrôles.Ceci est particulièrement utile pour les conversions et la sérialisation:
La idiomatiques type de test qui utilise la
isinstance
builtin:Cette case est à la fois précis et performant. C'est le plus souvent ce que les gens voulez pour la vérification de types:
int
sous-classe serait encore de passer ce test.isinstance(x, (int, long))
vous reçoit tous builtin entiers.Plus important encore, les inconvénients sont négligeables, la plupart du temps:
isinstance(x, list)
quand toute la séquence (par exemple,tuple
) ou même itérable (par exemple, ungenerator
) ferait aussi bien. C'est plus une préoccupation pour l'usage général des bibliothèques que des scripts ou des applications.Variantes
Si vous avez déjà un type,
issubclass
se comporte de la même:Python a une notion de les classes de base abstraites. Grosso modo, ils expriment le sens de types, et pas de leur hiérarchie:
En d'autres termes, le type(x) n'est pas nécessairement hériter de
numbers.Real
mais doit se comporter comme elle.Pourtant, c'est un très complexes et difficiles concept:
int
la plupart du temps.Cependant, il est très utile pour les bibliothèques génériques et des abstractions.
dict
vous limite à un type in-memory. En revanche,collections.abc.Mapping
comprend également la base de données des wrappers, des disques de grande capacité adossés à des dictionnaires, des paresseux, des conteneurs, ... - etdict
.collections.abc.Iterable
, ils travaillent tous dans unefor
boucle.Alors qu'il n'est généralement pas nécessaire de jeter les scripts, je vous recommande fortement de l'utiliser pour tout ce qui vit au-delà de quelques versions de python.
La idiomatiques de manipulation des types n'est pas de les tester, mais à supposer qu'elles sont compatibles. Si vous avez déjà s'attendre à quelques mauvais types dans votre entrée, il suffit de sauter tout ce qui n'est pas compatible:
Ce n'est pas réellement un type de case, mais sert généralement la même intention.
float
àint
.int
.L'inconvénient majeur est qu'il est explicite transformation.
str
contenant un littéral.float
àint
lorsque vous avez simplement besoin de chiffres.De Conversion est un outil efficace pour certains cas d'utilisation spécifiques. Il fonctionne mieux si vous savez à peu près ce que votre entrée est, et doit donner des garanties au sujet de votre sortie.
Le meilleur plan d'action est de vous assurer de ne jamais avoir à vérifier pour le type dans la première place. C'est un peu un méta-sujet, car il dépend fortement du cas d'utilisation.
Ici, la source de
somelist
ne devrait jamais avoir à mettre des numéros en elle.permettez-moi de déclarer la variable x de type int
Les deux fonctionne très bien.
Facile - utiliser des types.
Voici un rapide dir(types):
type(u"testing") == type("testing")
même si ils sont à la fois des chaînes de caractères.False
, tout le mal de la façon dont je l'ai écritVous pouvez utiliser le type de fonction sur les deux côtés de l'opérateur. Comme ceci:
type(u"testing") == type("testing")
même si ils sont à la fois des chaînes de caractères.