Come verificare se il tipo di una variabile è stringa?


766

C'è un modo per verificare se il tipo di una variabile in Python è un string, come:

isinstance(x,int);

per valori interi?


11
Lettura obbligatoria su isinstance se stai imparando python canonical.org/~kragen/isinstance .
Whaley,


Fai attenzione agli ints da allora isinstance(True, int) is True.
Albert Tugushev,

isinstance(x,str)è corretto in Python 3 (str è un tipo base).
MasterControlProgram

Risposte:


1139

In Python 2.x, lo faresti

isinstance(s, basestring)

basestringè la superclasse astratta di stre unicode. Può essere utilizzato per verificare se un oggetto è un'istanza di stro unicode.


In Python 3.x, il test corretto è

isinstance(s, str)

La bytesclasse non è considerata un tipo di stringa in Python 3.


10
@Yarin: No. Ma non importa, perché Python 3.x non è pensato per essere compatibile con Python 2.x.
netcoder

2
Ho scoperto che isinstance (s, str) funziona con py27, testato su: Python 2.7.5 (impostazione predefinita, 25 agosto 2013, 00:04:04) [GCC 4.2.1 Apple LLVM 5.0 compatibile (clang-500.0.68)] su darwin.
Kakyo,

25
@kakyo: il problema è che mancheranno unicodeoggetti, che dovrebbero anche essere considerati stringhe. Sia il tipo strche il tipo unicodehanno la classe base comune basestringe questo è ciò che si desidera verificare.
Sven Marnach,

7
@Yarin se stai eseguendo il porting di qualcosa da 2.xa 3.x, puoi sempre assegnare basestring = str.
Jack,

9
@AdamErickson Per la compatibilità con cosa esattamente? Non aiuta per la compatibilità con Python 3, poiché non esiste unicodein Python 3. La mia raccomandazione per la compatibilità tra Python 2 e 3 è di usare la libreria "sei". (Specificamente isintance(s, six.string_types)in questo caso)
Sven Marnach,

222

So che questo è un vecchio argomento, ma essendo il primo mostrato su Google e dato che non trovo nessuna delle risposte soddisfacenti, lo lascerò qui per riferimento futuro:

six è una libreria di compatibilità Python 2 e 3 che già tratta questo problema. È quindi possibile fare qualcosa del genere:

import six

if isinstance(value, six.string_types):
    pass # It's a string !!

Ispezionando il codice, ecco cosa trovi:

import sys

PY3 = sys.version_info[0] == 3

if PY3:
    string_types = str,
else:
    string_types = basestring,

4
Ad esempio per una riga:, value_is_string = isinstance(value, str if sys.version_info[0] >= 3 else basestring)dove >=assume che l'eventuale Python 4+ mantenga la strclasse radice per le stringhe.
Pi Marillion,

65

In Python 3.xo Python 2.7.6

if type(x) == str:

10
Mi piace l'eleganza di "if type (x) in (str, unicode):", ma vedo che PyLint lo contrassegna come "unidiomatic".
eukras il

16
Il confronto dei tipi con ==è esplicitamente scoraggiato da PEP8 e ha anche diversi aspetti negativi da considerare "unidiomatic", ad esempio non rileva casi di sottoclassi di str, che dovrebbero essere considerati anche stringhe. Se si desidera verificare esattamente il tipo stred escludere esplicitamente le sottoclassi, utilizzare type(x) is str.
Sven Marnach,

17

tu puoi fare:

var = 1
if type(var) == int:
   print('your variable is an integer')

o:

var2 = 'this is variable #2'
if type(var2) == str:
    print('your variable is a string')
else:
    print('your variable IS NOT a string')

spero che sia di aiuto!



11

Modifica in base alla risposta migliore di seguito. Scorri verso il basso circa 3 risposte e scopri la bellezza del basestring.

Vecchia risposta: fai attenzione alle stringhe unicode, che puoi ottenere da diverse posizioni, comprese tutte le chiamate COM in Windows.

if isinstance(target, str) or isinstance(target, unicode):

1
Buona pesca. Non sapevo di basestrare. È menzionato circa 3 post in basso e sembra una risposta migliore.
Wade Hatler,

6
isinstance()prende anche una tupla come secondo argomento. Quindi, anche se basestringnon esistesse, potresti semplicemente usare isinstance(target, (str, unicode)).
Martijn Pieters

3
In Python 3.5.1, unicodenon sembra essere definito:NameError: name 'unicode' is not defined
Eric Hu,

11

poiché basestringnon è definito in Python3, questo piccolo trucco potrebbe aiutare a rendere compatibile il codice:

try: # check whether python knows about 'basestring'
   basestring
except NameError: # no, it doesn't (it's Python3); use 'str' instead
   basestring=str

successivamente è possibile eseguire il seguente test su Python2 e Python3

isinstance(myvar, basestring)

4
O se vuoi catturare anche stringhe di byte:basestring = (str, bytes)
Contrassegna il riscatto il

10

Python 2/3 incluso unicode

from __future__ import unicode_literals
from builtins import str  #  pip install future
isinstance('asdf', str)   #  True
isinstance(u'asdf', str)  #  True

http://python-future.org/overview.html


1
Molte grazie! Ci sono dozzine di varie risposte su Internet, ma l'unico vantaggio è questo. La prima riga fa type('foo')essere unicodedi default in pitone 2, e la seconda marca stressendo istanza unicode. Thoses rende il codice valido in Python 2 e 3. Grazie ancora!
Narann

9

Inoltre voglio notare che se si desidera verificare se il tipo di una variabile è un tipo specifico, è possibile confrontare il tipo di variabile con il tipo di un oggetto noto.

Per la stringa puoi usare questo

type(s) == type('')

7
Questo è un modo terribile e terribile di digitare check in python. E se un'altra classe eredita str? Che dire delle stringhe unicode, che non ereditano nemmeno strin 2.x? Utilizzare isinstance(s, basestring)in 2.xo isinstance(s, str)in 3.x.
Jack,

1
@Jack, per favore leggi la domanda e nota anche che non scrivo che è il modo migliore, solo un altro modo.
Daniil Grankin,

9
Questa è una cattiva idea per 3 motivi: isinstance()consente le sottoclassi (che sono anche stringhe, solo specializzate), la type('')chiamata extra è ridondante quando si può semplicemente usare stre i tipi sono singoli, quindi type(s) is strsarà un test più efficiente.
Martijn Pieters

8

Molti buoni suggerimenti forniti da altri qui, ma non vedo un buon riepilogo multipiattaforma. Quanto segue dovrebbe essere una buona risposta per qualsiasi programma Python:

def isstring(s):
    # if we use Python 3
    if (sys.version_info[0] >= 3):
        return isinstance(s, str)
    # we use Python 2
    return isinstance(s, basestring)

In questa funzione, usiamo isinstance(object, classinfo)per vedere se il nostro input è strin in Python 3 o basestringin in Python 2.


1
Questo probabilmente si interromperà in Python 4, >=almeno considera .
Thakis,

2
sii più pulito per verificare six.string_types o six.text_type
daonb

@daonb importare un intero modulo solo per fare un test di una riga è il pensiero che fa sì che alberi pazzi di dipendenza e gonfiore serio rovinino quello che dovrebbe essere qualcosa di breve, piccolo e semplice. Ovviamente è la tua chiamata, ma dì solo ...
Duanev il

@duanev se sei preoccupato per la compatibilità con Python 2/3 è comunque meglio usarne sei nel progetto. Sei è anche un singolo file, quindi gli alberi di dipendenza / bloat non sono un problema qui.
MoxieBall,

7

Modo alternativo per Python 2, senza usare il basestring:

isinstance(s, (str, unicode))

Ma non funzionerà ancora in Python 3 poiché unicodenon è definito (in Python 3).


7

Così,

Hai molte opzioni per verificare se la tua variabile è stringa o no:

a = "my string"
type(a) == str # first 
a.__class__ == str # second
isinstance(a, str) # third
str(a) == a # forth
type(a) == type('') # fifth

Questo ordine è a scopo.


5
a = '1000' # also tested for 'abc100', 'a100bc', '100abc'

isinstance(a, str) or isinstance(a, unicode)

restituisce True

type(a) in [str, unicode]

restituisce True


Per Python 2.7.12 ho dovuto rimuovere le virgolette: digitare (a) in [str, unicode]
Adam Erickson

4

Ecco la mia risposta per supportare sia Python 2 che Python 3 insieme a questi requisiti:

  • Scritto in codice Py3 con codice Py2 minimo compatibile.
  • Rimuovere il codice compatibile Py2 in un secondo momento senza interruzioni. Vale a dire solo per la cancellazione, nessuna modifica al codice Py3.
  • Evita di utilizzare sixun modulo compatibile simile poiché tende a nascondere ciò che sta cercando di ottenere.
  • A prova di futuro per un potenziale Py4.

import sys
PY2 = sys.version_info.major == 2

# Check if string (lenient for byte-strings on Py2):
isinstance('abc', basestring if PY2 else str)

# Check if strictly a string (unicode-string):
isinstance('abc', unicode if PY2 else str)

# Check if either string (unicode-string) or byte-string:
isinstance('abc', basestring if PY2 else (str, bytes))

# Check for byte-string (Py3 and Py2.7):
isinstance('abc', bytes)

1

Se non si desidera dipendere da librerie esterne, questo funziona sia per Python 2.7+ che per Python 3 ( http://ideone.com/uB4Kdc ):

# your code goes here
s = ["test"];
#s = "test";
isString = False;

if(isinstance(s, str)):
    isString = True;
try:
    if(isinstance(s, basestring)):
        isString = True;
except NameError:
    pass;

if(isString):
    print("String");
else:
    print("Not String");

1

È possibile semplicemente utilizzare la funzione isinstance per assicurarsi che i dati di input siano in formato stringa o unicode . Gli esempi seguenti ti aiuteranno a capire facilmente.

>>> isinstance('my string', str)
True
>>> isinstance(12, str)
False
>>> isinstance('my string', unicode)
False
>>> isinstance(u'my string',  unicode)
True


-6

Ecco come lo faccio:

if type(x) == type(str()):

4
type(str())è un modo molto rotonda di dire str. I tipi sono singoli, quindi type(x) is strè più efficiente. isinstance()dovrebbe essere usato invece, a meno che tu non abbia ottime ragioni per ignorare le sottoclassi di str.
Martijn Pieters

se il tipo (x) è str:
shaurya uppal


-13
>>> thing = 'foo'
>>> type(thing).__name__ == 'str' or type(thing).__name__ == 'unicode'
True

2
In questo caso si preferisce type(thing).__name__ == 'str'sopra type(thing) == stro isinstance(thing, str)? Inoltre unicodenon esiste nelle versioni moderne di Python.
vaultah,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.