Déterminer si la variable Python est une instance d'un type
J'ai besoin pour déterminer si une variable Python est une instance de type natif: str
, int
, float
, bool
, list
, dict
et ainsi de suite. Est-il manière élégante de le faire?
Ou est-ce la seule manière:
if myvar in (str, int, float, bool):
# do something
Qu'entendez-vous par "natif"? Voulez-vous dire builtin? Pourquoi avez-vous besoin de le savoir? Python n'est pas du C++ ou du Java, donc il n'y a pas de distinction entre "simple" ou "de souche". Qu'essayez-vous de faire?
Oui, je suppose que je veux dire "builtin". J'ai besoin d'une telle représentation d'un objet, que je pouvais l'utiliser dans la sérialisation JSON. simplejson des "poignées" seulement ces types. Dans d'autres cas (lorsque les objets sont des instances de la "maison" des classes) j'ai besoin de faire dict objets.
Vous savez que simplejson a quelque chose appelé "l'objet de décodage" et "objet"codage?
Oui, Mais comme je l'ai compris - je devrais écrire un tel décodeur pour chaque type de classe je tiens à sérialiser. Je ne veux pas le faire.
Motsjonov: Veuillez mettre à jour votre question spécifiquement dire que vous êtes intéressé dans les types de simplejson gère par défaut.
Oui, je suppose que je veux dire "builtin". J'ai besoin d'une telle représentation d'un objet, que je pouvais l'utiliser dans la sérialisation JSON. simplejson des "poignées" seulement ces types. Dans d'autres cas (lorsque les objets sont des instances de la "maison" des classes) j'ai besoin de faire dict objets.
Vous savez que simplejson a quelque chose appelé "l'objet de décodage" et "objet"codage?
Oui, Mais comme je l'ai compris - je devrais écrire un tel décodeur pour chaque type de classe je tiens à sérialiser. Je ne veux pas le faire.
Motsjonov: Veuillez mettre à jour votre question spécifiquement dire que vous êtes intéressé dans les types de simplejson gère par défaut.
OriginalL'auteur Aleksandr Motsjonov | 2009-08-24
Vous devez vous connecter pour publier un commentaire.
La meilleure façon d'y parvenir est de collecter les types dans une liste de tuple appelé
primitiveTypes
et:La
types
module contient des collections de tous types importants qui peuvent aider à construire la liste/n-uplet.Fonctionne depuis Python 2.2
à l'aide de types de "types" n'est pas différent que d'utiliser la plus simple des noms (int, str, float, ...) directement!
Oui, c'est la façon dont les types de travaux. Mais il rend votre intention plus propre et, si vous utilisez des ensembles prédéfinis (StringTypes), vous obtenez plus de la portabilité entre les versions de Python.
Il est aussi légèrement plus vite ... 😉
Notez que le
types
module pas vraiment fournir une liste complète des types. Par exemple il n'y a pasint
. Toutefois, il y a labuildins
module qui fournit la plupart built-ins, de sorte que l'on peut fairebuiltin_types = tuple(getattr(builtins, t) for t in dir(builtins) if isinstance(getattr(builtins, t), type))
et ensuite utiliserisinstance(value, builtin_types)
.OriginalL'auteur Aaron Digulla
Pas que je sais pourquoi vous voulez le faire, comme il n'est pas "simple" types de Python, c'est tous les objets. Mais cela fonctionne:
Mais une liste explicite des types est probablement mieux que c'est plus clair. Ou encore mieux: la Modification de l'application de sorte que vous n'avez pas besoin de connaître la différence.
Mise à jour: Le problème à résoudre est de savoir comment faire un sérialiseur pour les objets, même ceux intégrés. La meilleure façon de le faire est de ne pas faire un big phat sérialiseur qui traite les builtins différemment, mais pour rechercher les sérialiseurs en fonction de leur type.
Quelque chose comme ceci:
De cette façon, vous pouvez facilement ajouter de nouveaux sérialiseurs, et le code est facile à entretenir et clair, que chaque type a son propre sérialiseur. Remarquez comment le fait que certains types sont builtin est devenu complètement hors de propos. 🙂
+1 "Modification de l'application de sorte que vous n'avez pas besoin de connaître la différence." Certains (très rares) fois est nécessaire de savoir, mais le plus probable n'est pas le cas.
OriginalL'auteur Lennart Regebro
Vous semblent être intéressés à en assurer la simplejson va gérer votre types. Ceci est fait trivialement par
Qui est plus fiable que d'essayer de deviner quels types de votre JSON de la mise en œuvre des poignées.
OriginalL'auteur S.Lott
C'est une vieille question, mais il semble aucune des réponses réellement répondre à la question précise: "(how-to) Déterminer si la variable Python est une instance d'un type". Notez qu'il n'est pas "[...] d'une spécifiques/ type" mais de un.
La bonne façon de de déterminer si un objet est une instance d'un bâti-type/classe est de vérifier si le type de l'objet se trouve être définie dans le module
__builtin__
.Avertissement: si
obj
est une classe, et non pas une instance, peu importe si cette classe est intégré ou pas, la valeur True est retourné depuis une classe est un objet, une instance detype
(c'est à direAnyClass.__class__
esttype
).OriginalL'auteur glarrain
Qu'est ce qu'un "autochtone de type" en Python? Merci de ne pas baser votre code sur les types, utilisation Duck-Typing.
OriginalL'auteur
Construit dans le type de fonction peut être utile:
OriginalL'auteur kolistivra
vous pouvez accéder à tous ces types de
types
module:pour rappel, le module d'importation
types
premièreOriginalL'auteur jacoolee
construction de S. Lott réponse, vous devriez avoir quelque chose comme ceci:
à utiliser:
ces appels d'utilisation spéciale de votre classe, et si simplejson peut prendre soin de l'objet, il sera. Sinon, votre fourre-tout de la fonctionnalité sera déclenchée, et éventuellement (en fonction de si vous utilisez l'option d'une partie) d'un objet peut définir ses propres sérialisation
OriginalL'auteur Terence Honles
Pour moi, la meilleure option est la suivante:
Ce correctif lorsque la valeur est un module et
value.__class__.__module__ == '__builtin__'
échouera.OriginalL'auteur asterio gonzalez