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)
basestring
Jest to streszczenie nadklasą z str
i unicode
. Można go użyć do sprawdzenia, czy obiekt jest instancją str
lub unicode
.
W Pythonie 3.x poprawnym testem jest
isinstance(s, str)
bytes
Klasa nie jest uważany za typ string w Pythonie 3.
unicode
obiektów, które również należy traktować jako łańcuchy. Zarówno typ, jak str
i typ unicode
mają wspólną klasę podstawową basestring
i właśnie tego chcesz sprawdzić.
basestring = str
.
unicode
w 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 str
klasę 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 str
i 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 basestring
nie istniał, możesz po prostu użyć isinstance(target, (str, unicode))
.
unicode
nie wydaje się być zdefiniowany:NameError: name 'unicode' is not defined
ponieważ basestring
nie 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 unicode
domyślnie w python 2, a druga marka str
jest 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ą str
po 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ć, str
a typy są singletonami, więc type(s) is str
bę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ą str
w Pythonie 3, czy basestring
w 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:
six
lub 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 str
są 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) == str
lub isinstance(thing, str)
? Również unicode
nie istnieje w nowoczesnych wersjach Pythona.