Czy istnieje sposób sprawdzenia, czy typ zmiennej w pythonie to string:
isinstance(x,int);
dla wartości całkowitych?
isinstance(True, int) is True.
isinstance(x,str)jest poprawny w Pythonie 3 (str jest typem podstawowym).
Czy istnieje sposób sprawdzenia, czy typ zmiennej w pythonie to string:
isinstance(x,int);
dla wartości całkowitych?
isinstance(True, int) is True.
isinstance(x,str)jest poprawny w Pythonie 3 (str jest typem podstawowym).
Odpowiedzi:
W Python 2.x zrobiłbyś to
isinstance(s, basestring)
basestringJest to streszczenie nadklasą z stri unicode. Można go użyć do sprawdzenia, czy obiekt jest instancją strlub unicode.
W Pythonie 3.x poprawnym testem jest
isinstance(s, str)
bytesKlasa nie jest uważany za typ string w Pythonie 3.
unicodeobiektów, które również należy traktować jako łańcuchy. Zarówno typ, jak stri typ unicodemają wspólną klasę podstawową basestringi właśnie tego chcesz sprawdzić.
basestring = str.
unicodew Pythonie 3. Moje zalecenie dotyczące zgodności między Pythonem 2 i 3 to korzystanie z biblioteki „six”. (Szczególnie isintance(s, six.string_types)w tym przypadku)
Wiem, że jest to stary temat, ale jako pierwszy pokazany w google i biorąc pod uwagę, że nie uważam żadnej z odpowiedzi za zadowalającą, zostawię to tutaj do wglądu w przyszłości:
six to biblioteka kompatybilności z Python 2 i 3, która już obejmuje ten problem. Następnie możesz zrobić coś takiego:
import six
if isinstance(value, six.string_types):
pass # It's a string !!
Sprawdzając kod, oto, co znajdziesz:
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)gdzie >=zakłada się, że w końcu Python 4+ zachowuje strklasę root dla łańcuchów.
W Python 3.x lub Python 2.7.6
if type(x) == str:
==jest wyraźnie odradzane przez PEP8 i ma kilka wad, które należy uznać za „jednodiomatyczne”, np. Nie wykrywa instancji podklas str, które również należy traktować jako łańcuchy. Jeśli naprawdę chcesz sprawdzić dokładnie typ stri wyraźnie wykluczyć podklasy, użyj type(x) is str.
Moduł typu istnieje również, jeśli sprawdzasz więcej niż wartości int i ciągi. http://docs.python.org/library/types.html
types.StringTypes.
Edytuj na podstawie lepszej odpowiedzi poniżej. Zejdź w dół o 3 odpowiedzi i dowiedz się o chłodzie basestringu.
Stara odpowiedź: uważaj na ciągi znaków Unicode, które można uzyskać z kilku miejsc, w tym wszystkich wywołań COM w systemie Windows.
if isinstance(target, str) or isinstance(target, unicode):
isinstance()bierze również krotkę jako drugi argument. Więc nawet jeśli basestringnie istniał, możesz po prostu użyć isinstance(target, (str, unicode)).
unicodenie wydaje się być zdefiniowany:NameError: name 'unicode' is not defined
ponieważ basestringnie jest zdefiniowany w Python3, ta mała sztuczka może pomóc w kompatybilności kodu:
try: # check whether python knows about 'basestring'
basestring
except NameError: # no, it doesn't (it's Python3); use 'str' instead
basestring=str
po tym możesz uruchomić następujący test na Python2 i Python3
isinstance(myvar, basestring)
basestring = (str, bytes)
Python 2/3 łącznie z Unicode
from __future__ import unicode_literals
from builtins import str # pip install future
isinstance('asdf', str) # True
isinstance(u'asdf', str) # True
type('foo')jest unicodedomyślnie w python 2, a druga marka strjest instancją unicode. To sprawia, że kod jest poprawny w Pythonie 2 i 3. Jeszcze raz dziękuję!
Chcę również zauważyć, że jeśli chcesz sprawdzić, czy typ zmiennej jest określonym rodzajem, możesz porównać typ zmiennej z typem znanego obiektu.
W przypadku ciągu możesz użyć tego
type(s) == type('')
str? Co z ciągami znaków Unicode, które nawet nie dziedziczą strpo 2.x? Użyj isinstance(s, basestring)w 2.x lub isinstance(s, str)3.x.
isinstance()pozwala na podklasy (które są również łańcuchami, po prostu wyspecjalizowane), dodatkowe type('')wywołanie jest zbędne, gdy można po prostu użyć, stra typy są singletonami, więc type(s) is strbędzie to bardziej wydajny test.
Wiele dobrych sugestii dostarczonych przez innych tutaj, ale nie widzę dobrego podsumowania dla wielu platform. Poniższe informacje powinny być dobrym rozwiązaniem dla każdego programu w języku 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)
W tej funkcji używamy, isinstance(object, classinfo)aby sprawdzić, czy nasze dane wejściowe są strw Pythonie 3, czy basestringw Pythonie 2.
>=przynajmniej weź pod uwagę .
a = '1000' # also tested for 'abc100', 'a100bc', '100abc'
isinstance(a, str) or isinstance(a, unicode)
zwraca True
type(a) in [str, unicode]
zwraca True
Oto moja odpowiedź na obsługę zarówno Pythona 2, jak i Pythona 3 wraz z następującymi wymaganiami:
sixlub podobnego modułu zgodności, ponieważ mają tendencję do ukrywania tego, co próbuje się osiągnąć.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)
Jeśli nie chcesz polegać na zewnętrznych bibliotekach, działa to zarówno w przypadku Python 2.7+, jak i 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");
Można po prostu użyć isinstance funkcji, aby upewnić się, że dane wejściowe jest od formatu ciąg lub Unicode . Poniższe przykłady pomogą ci łatwo zrozumieć.
>>> 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)
Tak to robię:
if type(x) == type(str()):
type(str())to bardzo okrągły sposób powiedzenia str. Typy są singletonami, więc type(x) is strsą bardziej wydajne. isinstance()należy użyć zamiast tego, chyba że masz bardzo dobre powody, aby zignorować podklasy str.
Widziałem:
hasattr(s, 'endswith')
>>> thing = 'foo'
>>> type(thing).__name__ == 'str' or type(thing).__name__ == 'unicode'
True
type(thing).__name__ == 'str'nad type(thing) == strlub isinstance(thing, str)? Również unicodenie istnieje w nowoczesnych wersjach Pythona.