2013-05-10 17 views
23

Ho un'applicazione che ha un paio di comandi. Quando si digita un determinato comando, è necessario digitare ulteriori informazioni su qualcosa/qualcuno. Ora che le informazioni devono essere strettamente un numero intero o una stringa, a seconda della situazione.Come verificare se una variabile è un intero o una stringa?

Tuttavia, qualunque cosa si digiti in Python usando raw_input() è effettivamente una stringa, non importa cosa, in modo più specifico, come farei a breve e senza provare ... tranne vedere se una variabile è composta da cifre o caratteri?

+2

Si potrebbe fare: '" 0 ".isdigit()'. Documentazione: http://docs.python.org/2/library/stdtypes.html#str.isdigit – bernie

+0

Controllare il tipo di un oggetto in Python è una cattiva idea - rende la natura dinamica di Python meno utile. * È più facile chiedere perdono che il permesso. * –

+1

Perché l'avversione a 'try'..'except' qui? Questo è * esattamente * quello che useresti la gestione delle eccezioni * per *. –

risposta

49

A mio parere ci sono due opzioni:

  • Prova a convertirlo in un int, ma prendi l'eccezione:

    try: 
        value = int(value) 
    except ValueError: 
        pass # it was a string, not an int. 
    

    Questo è l'approccio Chiedi perdono.

  • esplicitamente testare se ci sono solo cifre nella stringa:

    value.isdigit() 
    

    str.isdigit() restituisce True solo se tutti i caratteri nella stringa sono cifre (0 - 9).

    Il unicode/Python 3 str tipo equivalente è unicode.isdecimal()/str.isdecimal(); solo i decimali Unicode possono essere convertiti in numeri interi, poiché non tutte le cifre hanno un valore intero effettivo (U+00B2 SUPERSCRIPT 2 è una cifra, ma non un decimale, ad esempio).

    Questo è spesso chiamato l'approccio Chiedi permesso o Guarda prima di saltare.

Quest'ultimo non rileverà tutte int() valori validi, come spazi vuoti e + e - sono anche permesso in int() valori. Il primo modulo accetta felicemente ' +10 ' come numero, il secondo no.

Se si prevede che l'utente contenga normalmente un numero intero, utilizzare il primo modulo. È più facile (e più veloce) chiedere perdono piuttosto che ottenere il permesso in quel caso.

+0

Le altre opzioni sono. Meglio dire che queste due opzioni sono proprio ciò che consiglieresti a te stesso. –

+0

@android: le altre opzioni sono eccessive per la maggior parte delle situazioni. Eppure, quantificato. –

+0

Il problema è che non capisco davvero provare ... tranne, quindi se potessi spiegarlo più a fondo, sarebbe fantastico. – user2154354

5

Il isdigit method of the str type restituisce True se la stringa data non è altro che una o più cifre. Se non lo è, sai che la stringa dovrebbe essere trattata come una semplice stringa.

+1

isdigit() retunrs False per i numeri negativi – Mawg

14

se si desidera controllare quello che è:

>>>isinstance(1,str) 
False 
>>>isinstance('stuff',str) 
True 
>>>isinstance(1,int) 
True 
>>>isinstance('stuff',int) 
False 

se si desidera ottenere interi da raw_input

>>>x=raw_input('enter thing:') 
enter thing: 3 
>>>try: x = int(x) 
    except: pass 

>>>isinstance(x,int) 
True 
+0

Utilizzare basestring anziché str, per rilevare l'unicode, vedere http://stackoverflow.com/questions/1979004/what-is-the-difference-between-isinstanceaaa-basestring-and-isinstanceaaa – gseattle

+0

Questo è perfetto per me, funziona con numeri positivi e negativi ... fantastico, grazie –

1

Non controllare. Andare avanti e assumere che è l'input giusto, e prendere un'eccezione se non lo è.

intresult = None 
while intresult is None: 
    input = raw_input() 
    try: intresult = int(input) 
    except ValueError: pass 
1

A seconda della definizione di poco, è possibile utilizzare una delle seguenti opzioni:

Problemi correlati