stringhe - Come determinare il tipo di una variabile Python?




python convertire stringa in numero (10)

Come vedo il tipo di una variabile se è senza segno a 32 bit, firmata a 16 bit, ecc.?

Come lo vedo?


Come determinare il tipo di variabile in Python?

Quindi se hai una variabile, ad esempio:

one = 1

Vuoi sapere il suo tipo?

Ci sono modi giusti e modi sbagliati per fare praticamente tutto in Python. Ecco il modo giusto:

Usa il type

>>> type(one)
<type 'int'>

È possibile utilizzare l'attributo __name__ per ottenere il nome dell'oggetto. (Questo è uno dei pochi attributi speciali di cui hai bisogno per usare il nome __dunder__ per arrivare - non c'è nemmeno un metodo per questo nel modulo __dunder__ .)

>>> type(one).__name__
'int'

Non usare __class__

In Python, i nomi che iniziano con caratteri di sottolineatura non fanno parte semanticamente dell'API pubblica ed è consigliabile che gli utenti evitino di utilizzarli. (Tranne quando assolutamente necessario).

Dal momento che il type ci fornisce la classe dell'oggetto, dovremmo evitare di farlo direttamente. :

>>> one.__class__

Questa è solitamente la prima idea che le persone hanno quando accedono al tipo di un oggetto in un metodo - stanno già cercando gli attributi, quindi il tipo sembra strano. Per esempio:

class Foo(object):
    def foo(self):
        self.__class__

Non farlo. Invece, digita (auto):

class Foo(object):
    def foo(self):
        type(self)

Dettagli di implementazione di interi e galleggianti

Come vedo il tipo di una variabile se è senza segno a 32 bit, firmata a 16 bit, ecc.?

In Python, queste specifiche sono dettagli di implementazione. Quindi, in generale, di solito non ci preoccupiamo di questo in Python. Tuttavia, per saziare la tua curiosità ...

In Python 2, int è di solito un intero con segno uguale alla larghezza della word dell'implementazione (limitata dal sistema). Di solito è implementato come un lungo in C. Quando gli interi diventano più grandi di questo, di solito li convertiamo in Python long (con precisione illimitata, da non confondere con C long).

Ad esempio, in Python 2 a 32 bit, possiamo dedurre che int è un intero con segno a 32 bit:

>>> import sys

>>> format(sys.maxint, '032b')
'01111111111111111111111111111111'
>>> format(-sys.maxint - 1, '032b') # minimum value, see docs.
'-10000000000000000000000000000000'

In Python 3, il vecchio int va via, e usiamo solo (di Python) come int, che ha una precisione illimitata.

Possiamo anche ottenere alcune informazioni sui float di Python, che di solito sono implementati come un doppio in C:

>>> sys.float_info
sys.floatinfo(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, 
min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, 
mant_dig=53, epsilon=2.2204460492503131e-16, radix=2, rounds=1)

Conclusione

Non utilizzare __class__ , un'API semanticamente non pubblica, per ottenere il tipo di una variabile. Usa invece il type .

E non preoccuparti troppo dei dettagli di implementazione di Python. Non ho avuto a che fare con problemi di questo genere. Probabilmente neanche tu lo farai, e se lo fai davvero, dovresti sapere abbastanza per non essere in cerca di questa risposta su cosa fare.


È così semplice Lo fai così.

print(type(variable_name))

Esempi di semplice controllo del tipo in Python:

assert type(variable_name) == int

assert type(variable_name) == bool

assert type(variable_name) == list

Forse stai cercando la funzione type() .

Vedi gli esempi qui sotto, ma non esiste un tipo "non firmato" in Python come Java.

Intero positivo:

>>> v = 10
>>> type(v)
<type 'int'>

Grande numero intero positivo:

>>> v = 100000000000000
>>> type(v)
<type 'long'>

Intero negativo:

>>> v = -10
>>> type(v)
<type 'int'>

Sequenza letterale di personaggi:

>>> v = 'hi'
>>> type(v)
<type 'str'>

Numero intero virgola mobile:

>>> v = 3.14159
>>> type(v)
<type 'float'>

La domanda è alquanto ambigua - non sono sicuro di cosa intendi per "vista". Se stai cercando di interrogare il tipo di un oggetto Python nativo, la risposta di @atzz ti guiderà nella giusta direzione.

Tuttavia, se stai provando a generare oggetti Python che hanno la semantica di tipi C primitivi, (come uint32_t , int16_t ), usa il modulo struct . È possibile determinare il numero di bit in una data primitiva di tipo C in questo modo:

>>> struct.calcsize('c') # char
1
>>> struct.calcsize('h') # short
2
>>> struct.calcsize('i') # int
4
>>> struct.calcsize('l') # long
4

Ciò si riflette anche nel modulo array , che può creare array di questi tipi di livello inferiore:

>>> array.array('c').itemsize # char
1

Il numero intero massimo supportato ( int Python 2) è dato da sys.maxint .

>>> import sys, math
>>> math.ceil(math.log(sys.maxint, 2)) + 1 # Signedness
32.0

C'è anche sys.getsizeof , che restituisce la dimensione effettiva dell'oggetto Python nella memoria residua:

>>> a = 5
>>> sys.getsizeof(a) # Residual memory.
12

Per dati sys.float_info e dati di precisione, usa sys.float_info :

>>> sys.float_info
sys.floatinfo(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.2204460492503131e-16, radix=2, rounds=1)

Per python2.x, utilizzare

print type(variable_name)

Per python3.x, utilizzare

print(type(variable_name))

Python non ha gli stessi tipi di C / C ++, che sembra essere la tua domanda.

Prova questo:

>>> i = 123
>>> type(i)
<type 'int'>
>>> type(i) is int
True
>>> i = 123456789L
>>> type(i)
<type 'long'>
>>> type(i) is long
True
>>> i = 123.456
>>> type(i)
<type 'float'>
>>> type(i) is float
True

Tuttavia, la distinzione tra int e long va via in Python 3.0.


Python non ha tipi come quelli che descrivi. Ci sono due tipi usati per rappresentare i valori interi: int , che corrisponde al tipo int della piattaforma in C, e long , che è un numero intero di precisione arbitraria (cioè cresce al bisogno e non ha un limite superiore). int s viene convertito automaticamente in long se un'espressione produce un risultato che non può essere memorizzato in int .


Un altro modo usando __class__ :

>>> a = [1, 2, 3, 4]
>>> a.__class__
<type 'list'>
>>> b = {'key1': 'val1'}
>>> b.__class__
<type 'dict'>
>>> c = 12
>>> c.__class__
<type 'int'>

print type(variable_name)

Raccomando anche l'interprete interattivo IPython quando si tratta di domande come questa. Ti permette di digitare variable_name? e restituirà un intero elenco di informazioni sull'oggetto incluso il tipo e la stringa doc per il tipo.

per esempio

In [9]: var = 123

In [10]: var?
Type:       int
Base Class: <type 'int'>
String Form:    123
Namespace:  Interactive
Docstring:
    int(x[, base]) -> integer

Convertire una stringa o un numero in un numero intero, se possibile. Un argomento in virgola mobile verrà troncato verso zero (questo non include una rappresentazione in formato stringa di un numero in virgola mobile!) Quando si converte una stringa, utilizzare la base opzionale. È un errore fornire una base quando si converte una non stringa. Se l'argomento è al di fuori dell'intervallo intero, verrà restituito un oggetto lungo.





16-bit