@Yarin: Nie. Ale to nie ma znaczenia, ponieważ Python 3.x wcale nie jest kompatybilny z Python 2.x.
netcoder
2
Stwierdziłem, że isinstance (s, str) działa z py27, przetestowany na: Python 2.7.5 (domyślnie, 25 sierpnia 2013, 00:04:04) [Kompatybilny z GCC 4.2.1 Apple LLVM 5.0 (clang-500.0.68)] na darwin.
kakyo
25
@kakyo: Problem polega na tym, że będzie brakować 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ć.
Sven Marnach
7
@Yarin, jeśli przenosisz coś z wersji 2.x na 3.x, zawsze możesz to przypisać basestring = str.
Jack
9
@AdamErickson Dla zgodności z czym dokładnie? Nie pomaga w kompatybilności z Python 3, ponieważ nie ma go 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)
Sven Marnach
222
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 !!
Np. Dla jednej linijki: 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.
Podoba mi się elegancja „if type (x) in (str, unicode):”, ale widzę, że PyLint zaznacza to jako „unidiomatic”.
eukras
15
Porównywanie typów z ==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.
Sven Marnach,
17
możesz to zrobić:
var =1if type(var)== int:print('your variable is an integer')
lub:
var2 ='this is variable #2'if type(var2)== str:print('your variable is a string')else:print('your variable IS NOT a string')
Dobry chwyt Nie wiedziałem o bazowaniu. Wspomniano o 3 postach w dół i wydaje się lepszą odpowiedzią.
Wade Hatler,
6
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)).
Martijn Pieters
3
W Pythonie 3.5.1 unicodenie wydaje się być zdefiniowany:NameError: name 'unicode' is not defined
Eric Hu
11
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
exceptNameError:# 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
Wielkie dzięki! Istnieje wiele różnych odpowiedzi w Internecie, ale jedynym dobrym jest ten. Pierwsza linia sprawia, że 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ę!
Narann,
9
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.
Jest to okropny, straszny sposób wpisywania sprawdzania w pythonie. Co jeśli odziedziczy inna klasa 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.
Jack
1
@Jack, przeczytaj pytanie, a także zauważ, że nie piszę, że to najlepszy sposób, tylko inny sposób.
Daniil Grankin
9
Jest to zły pomysł z 3 powodów: 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.
Martijn Pieters
8
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 3if(sys.version_info[0]>=3):return isinstance(s, str)# we use Python 2return 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.
To prawdopodobnie pęknie w Pythonie 4, >=przynajmniej weź pod uwagę .
thakis
2
bądź czystszy, aby sprawdzić, czy występują sześć
typów
@daonb importujący cały moduł tylko w celu przeprowadzenia testu jednowierszowego to myślenie, które powoduje, że szalone drzewa zależności i poważne wzdęcia psują coś, co powinno być czymś krótkim i małym. To twój telefon, oczywiście, ale po prostu powiedz ...
duanev
@duanev, jeśli martwisz się kompatybilnością z Pythonem 2/3, lepiej jest użyć w projekcie sześciu. Sześć jest również jednym plikiem, więc drzewa zależności / wzdęcia nie są tutaj problemem.
MoxieBall
7
Alternatywny sposób dla Python 2, bez użycia ciągu bazowego:
isinstance(s,(str, unicode))
Ale nadal nie będzie działać w Pythonie 3, ponieważ unicodenie jest zdefiniowany (w Pythonie 3).
W przypadku Python 2.7.12 musiałem usunąć cudzysłowy: wpisz (a) w [str, unicode]
Adam Erickson
4
Oto moja odpowiedź na obsługę zarówno Pythona 2, jak i Pythona 3 wraz z następującymi wymaganiami:
Zapisany w kodzie Py3 z minimalnym kodem zgodności Py2.
Usuń kod kompatybilności Py2 później bez zakłóceń. Tj. Chodzi tylko o usunięcie, bez modyfikacji kodu Py3.
Unikaj używania sixlub podobnego modułu zgodności, ponieważ mają tendencję do ukrywania tego, co próbuje się osiągnąć.
Przyszłość dla potencjalnego 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)
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ć.
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.
W takim przypadku wolisz type(thing).__name__ == 'str'nad type(thing) == strlub isinstance(thing, str)? Również unicodenie istnieje w nowoczesnych wersjach Pythona.
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
basestring
Jest to streszczenie nadklasą zstr
iunicode
. Można go użyć do sprawdzenia, czy obiekt jest instancjąstr
lubunicode
.W Pythonie 3.x poprawnym testem jest
bytes
Klasa nie jest uważany za typ string w Pythonie 3.źródło
unicode
obiektów, które również należy traktować jako łańcuchy. Zarówno typ, jakstr
i typunicode
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ólnieisintance(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:
Sprawdzając kod, oto, co znajdziesz:
źródło
value_is_string = isinstance(value, str if sys.version_info[0] >= 3 else basestring)
gdzie>=
zakłada się, że w końcu Python 4+ zachowujestr
klasę root dla łańcuchów.W Python 3.x lub Python 2.7.6
źródło
==
jest wyraźnie odradzane przez PEP8 i ma kilka wad, które należy uznać za „jednodiomatyczne”, np. Nie wykrywa instancji podklasstr
, które również należy traktować jako łańcuchy. Jeśli naprawdę chcesz sprawdzić dokładnie typstr
i wyraźnie wykluczyć podklasy, użyjtype(x) is str
.możesz to zrobić:
lub:
mam nadzieję że to pomoże!
źródło
Moduł typu istnieje również, jeśli sprawdzasz więcej niż wartości int i ciągi. http://docs.python.org/library/types.html
źródło
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.
źródło
isinstance()
bierze również krotkę jako drugi argument. Więc nawet jeślibasestring
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:po tym możesz uruchomić następujący test na Python2 i Python3
źródło
basestring = (str, bytes)
Python 2/3 łącznie z Unicode
http://python-future.org/overview.html
źródło
type('foo')
jestunicode
domyślnie w python 2, a druga markastr
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
źródło
str
? Co z ciągami znaków Unicode, które nawet nie dziedzicząstr
po 2.x? Użyjisinstance(s, basestring)
w 2.x lubisinstance(s, str)
3.x.isinstance()
pozwala na podklasy (które są również łańcuchami, po prostu wyspecjalizowane), dodatkowetype('')
wywołanie jest zbędne, gdy można po prostu użyć,str
a typy są singletonami, więctype(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:
W tej funkcji używamy,
isinstance(object, classinfo)
aby sprawdzić, czy nasze dane wejściowe sąstr
w Pythonie 3, czybasestring
w Pythonie 2.źródło
>=
przynajmniej weź pod uwagę .Alternatywny sposób dla Python 2, bez użycia ciągu bazowego:
Ale nadal nie będzie działać w Pythonie 3, ponieważ
unicode
nie jest zdefiniowany (w Pythonie 3).źródło
Więc,
Masz wiele opcji, aby sprawdzić, czy twoja zmienna jest ciągiem:
To zamówienie jest celowe.
źródło
zwraca True
zwraca True
źródło
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ąć.źródło
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 ):
źródło
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ć.
źródło
źródło
Tak to robię:
źródło
type(str())
to bardzo okrągły sposób powiedzeniastr
. Typy są singletonami, więctype(x) is str
są bardziej wydajne.isinstance()
należy użyć zamiast tego, chyba że masz bardzo dobre powody, aby zignorować podklasystr
.Widziałem:
źródło
źródło
type(thing).__name__ == 'str'
nadtype(thing) == str
lubisinstance(thing, str)
? Równieżunicode
nie istnieje w nowoczesnych wersjach Pythona.