C'è un modo per verificare se il tipo di una variabile in Python è un string
, come:
isinstance(x,int);
per valori interi?
isinstance(True, int) is True
.
isinstance(x,str)
è corretto in Python 3 (str è un tipo base).
C'è un modo per verificare se il tipo di una variabile in Python è un string
, come:
isinstance(x,int);
per valori interi?
isinstance(True, int) is True
.
isinstance(x,str)
è corretto in Python 3 (str è un tipo base).
Risposte:
In Python 2.x, lo faresti
isinstance(s, basestring)
basestring
è la superclasse astratta di str
e unicode
. Può essere utilizzato per verificare se un oggetto è un'istanza di str
o unicode
.
In Python 3.x, il test corretto è
isinstance(s, str)
La bytes
classe non è considerata un tipo di stringa in Python 3.
unicode
oggetti, che dovrebbero anche essere considerati stringhe. Sia il tipo str
che il tipo unicode
hanno la classe base comune basestring
e questo è ciò che si desidera verificare.
basestring = str
.
unicode
in 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)
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,
value_is_string = isinstance(value, str if sys.version_info[0] >= 3 else basestring)
dove >=
assume che l'eventuale Python 4+ mantenga la str
classe radice per le stringhe.
In Python 3.xo Python 2.7.6
if type(x) == str:
==
è 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 str
ed escludere esplicitamente le sottoclassi, utilizzare type(x) is str
.
Il modulo del tipo esiste anche se stai controllando più di ints e stringhe. http://docs.python.org/library/types.html
types.StringTypes
,.
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):
isinstance()
prende anche una tupla come secondo argomento. Quindi, anche se basestring
non esistesse, potresti semplicemente usare isinstance(target, (str, unicode))
.
unicode
non sembra essere definito:NameError: name 'unicode' is not defined
poiché basestring
non è 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)
basestring = (str, bytes)
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
type('foo')
essere unicode
di default in pitone 2, e la seconda marca str
essendo istanza unicode
. Thoses rende il codice valido in Python 2 e 3. Grazie ancora!
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('')
str
? Che dire delle stringhe unicode, che non ereditano nemmeno str
in 2.x? Utilizzare isinstance(s, basestring)
in 2.xo isinstance(s, str)
in 3.x.
isinstance()
consente le sottoclassi (che sono anche stringhe, solo specializzate), la type('')
chiamata extra è ridondante quando si può semplicemente usare str
e i tipi sono singoli, quindi type(s) is str
sarà un test più efficiente.
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 è str
in in Python 3 o basestring
in in Python 2.
>=
almeno considera .
a = '1000' # also tested for 'abc100', 'a100bc', '100abc'
isinstance(a, str) or isinstance(a, unicode)
restituisce True
type(a) in [str, unicode]
restituisce True
Ecco la mia risposta per supportare sia Python 2 che Python 3 insieme a questi requisiti:
six
un modulo compatibile simile poiché tende a nascondere ciò che sta cercando di ottenere.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)
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");
È 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
s = '123'
issubclass(s.__class__, str)
Ecco come lo faccio:
if type(x) == type(str()):
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
.
Ho visto:
hasattr(s, 'endswith')
>>> thing = 'foo'
>>> type(thing).__name__ == 'str' or type(thing).__name__ == 'unicode'
True
type(thing).__name__ == 'str'
sopra type(thing) == str
o isinstance(thing, str)
? Inoltre unicode
non esiste nelle versioni moderne di Python.