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 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.
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.
basestring = str.
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)
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 strclasse 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 stred 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 basestringnon esistesse, potresti semplicemente usare isinstance(target, (str, unicode)).
unicodenon sembra essere definito:NameError: name 'unicode' is not defined
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)
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 unicodedi default in pitone 2, e la seconda marca stressendo 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 strin 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 stre i tipi sono singoli, quindi type(s) is strsarà 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 è strin in Python 3 o basestringin 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:
sixun 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) == stro isinstance(thing, str)? Inoltre unicodenon esiste nelle versioni moderne di Python.