2015-10-15 1 views
1

Je travaille sur un programme simple qui demandera le temps et la température et sortira quels vêtements l'utilisateur devrait porter. Cependant, je suis arrivé au point où je veux m'assurer que l'utilisateur ne peut pas entrer "g" degrés ou toute autre chaîne. Existe-t-il un moyen simple de comparer les types de variables? En d'autres termes, y a-t-il quelque chose comme:Comment comparer les types de variables en python?

if (type(temp) == 'str'): 

    print("Invalid. Try again.") 

Ou quelque chose de similaire qui n'est pas trop compliqué? Personnellement, je suis d'accord avec l'utilisation des fonctions avancées et autres joyeusetés, mais cela semblerait peu à mon professeur CS.

+0

Vérifiez ceci, il y a une tonne d'information ici: https://docs.python.org/2/library/string.html – ergonaut

+0

Notez que l'entrée est lue par 'input()' dans Python 3 et par 'raw_input()' en Python 2 est toujours une chaîne, même si c'est une chaîne de chiffres, donc vérifier le type ne vous dira rien. Vous devrez essayer de convertir la chaîne en un autre type, en utilisant par ex. 'int (s)' ou 'float (s)', comme le montre la réponse de Makoto. – deltab

Répondre

1

Vous l'avez à peu près raison, pas besoin de devis.

>>> type(5) == int 
True 
>>> type('5') == int 
False 
>>> type('5') == str 
True 
2

It's easier to beg forgiveness than to ask permission.

Tenir compte ce que la plupart d'entre nous faire dans ce scénario (cela suppose Python 3):

temp = int(input("Enter a numerical input: ")) 

Si l'entrée que nous obtenons est pas un nombre, nous soufflons avec un ValueError. Sachant cela, nous devrions attraper ...:

try: 
    temp = int(input("Enter a numerical input: ")) 
except ValueError as e: 
    print("Invalid input - please enter a whole number!"); 

Ne pas jouer avec le contrôle de type, car cela fera votre code un peu moins Pythonic. Au lieu de cela, n'ayez pas peur que ce code a la chance de sauter; Si c'est le cas, il suffit d'attraper l'exception et de faire face aux conséquences plus tard.

+1

N'attrape-t-il pas les exceptions terriblement lentement? – user2136963

1

Python a une fonction intégrée pour vérifier les types de variables. De l'docs

isinstance (objet, ClassInfo)

retour vrai si l'argument objet est une instance de l'argument ClassInfo, ou d'un (direct, indirect ou virtuel) sous-classe de celle-ci. Renvoie également true si classinfo est un objet de type (classe de style nouveau) et si l'objet est un objet de ce type ou d'une sous-classe (directe, indirecte ou virtuelle) de ce type. Si l'objet n'est pas une instance de classe ou un objet du type donné, la fonction renvoie toujours la valeur false. Si classinfo n'est ni un objet de classe, ni un objet de type , il peut s'agir d'un tuple d'objets de classe ou de type, ou peut contenir d'autres types (les autres types de séquences ne sont pas acceptés). Si classinfo n'est pas une classe, un type ou un tuple de classes, types et tuples, une exception TypeError est déclenchée.

Par exemple:

>>>n=3 
>>>isinstance(n, int) 
True 
>>>isinstance(n, str) 
False 
>>>m="example" 
>>>isinstance(m, int) 
False 
>>>isinstance(m, str) 
True 
0

Je viens suis tombé sur ce et je pensais que même si cette question a été posée il y a longtemps, au profit d'autres utilisateurs, je vais mettre ma place de solution.

J'ai créé une fonction d'assistance qui vérifie le type d'exception attrapant:

def TypeChecker(var): 
    result = 1 
    try: 
     int(var) 
    except: 
     result = 2 
    return 

ensuite dans le corps principal de code, chaque fois que je veux vérifier l'identité de type I simplement écrire quelque chose comme ceci:

if TypeChecker(var1) == TypeChecker(var2): 
    do_stuff... 

cette approche permet également à l'utilisateur de modifier le type de variable en fonction de celle d'une autre variable, car avec cette fonction, un entier retournera 1 et une chaîne retournera 2.