Jak mogę sprawdzić, czy obiekt Python jest łańcuchem (zwykłym lub Unicode)?
python
string
types
compatibility
Matt S.
źródło
źródło
Odpowiedzi:
Python 2
Użyj
isinstance(obj, basestring)
do testowania obiektuobj
.Docs .
źródło
Python 2
Aby sprawdzić, czy obiekt
o
jest typem ciągu podklasy typu ciągu:ponieważ oba
str
iunicode
są podklasybasestring
.Aby sprawdzić, czy typ
o
jest dokładniestr
:Aby sprawdzić, czy
o
jest instancjąstr
lub jakąkolwiek podklasąstr
:Powyższe działa również dla ciągów Unicode, jeśli zastąpisz
str
jeunicode
.Jednak może nie być wcale konieczne wykonywanie jawnego sprawdzania typu. „Pisanie kaczką” może pasować do twoich potrzeb. Zobacz http://docs.python.org/glossary.html#term-duck-typing .
Zobacz także Jaki jest kanoniczny sposób sprawdzania typu w python?
źródło
basestring
w py2.Python 3
W Pythonie 3.x
basestring
nie jest już dostępny, podobnie jakstr
jedyny typ ciągu (z semantyką Pythona 2.xunicode
).Zatem sprawdzenie w Pythonie 3.x to po prostu:
Jest to zgodne z poprawką oficjalnego
2to3
narzędzia konwersji: konwersjabasestring
dostr
.źródło
Python 2 i 3
(kompatybilny)
Jeśli chcesz sprawdzić bez względu na wersję Pythona (2.x vs. 3.x), użyj
six
( PyPI ) i jegostring_types
atrybutu:Wewnątrz
six
(bardzo lekki moduł z jednym plikiem) po prostu robi to :źródło
future
( PyPI ), aby nawet zachować nazwę:from past.builtins import basestring
basestring
a potem wróć dostr
. Np.def is_string(obj): try: return isinstance(obj, basestring) # python 2 except NameError: return isinstance(obj, str) # python 3
Znalazłem to i więcej
pythonic
:ponieważ są obiekty typu singleton, to można wykorzystać, aby wykonać porównanie obiektu do rodzaju str
źródło
isinstance(obj_to_test, str)
jest oczywiście przeznaczony do testowania typu, i ma tę zaletę, że stosuje tę samą procedurę, co w przypadku innych przypadków innych niż str.Jeśli ktoś chce się trzymać z dala od wyraźnego typu sprawdzania (i tam są dobre powody, aby trzymać z dala od niego), prawdopodobnie najbezpieczniejsze części protokołu strun do wyboru jest:
Nie będzie iterować przez iterowalny lub iterator, nie nazywa listy ciągów ciągiem i poprawnie wykrywa ciąg podobny do łańcucha.
Oczywiście są wady. Na przykład
str(maybe_string)
może być ciężka kalkulacja. Jak często odpowiedź brzmi: to zależy .EDYCJA: Jak wskazuje @Tcll w komentarzach, pytanie faktycznie dotyczy sposobu wykrywania zarówno ciągów znaków Unicode, jak i bajtowania. W Pythonie 2 ta odpowiedź nie powiedzie się, z wyjątkiem ciągów znaków Unicode zawierających znaki inne niż ASCII, a w Pythonie 3 wróci do wszystkich bajtów.
False
źródło
b = b'test'; r = str(b) == b
gdzieb
przechowuje takie same dane jak,str(b)
ale (będąc obiektem bajtów) nie sprawdza się jako ciąg.Aby sprawdzić, czy twoja zmienna jest czymś, co możesz zrobić:
Wynik isistance da ci logiczną wartość True lub False, dzięki czemu będziesz mógł odpowiednio dostosować. Możesz sprawdzić oczekiwany akronim swojej wartości, początkowo używając: type (s) Zwróci to napis „str”, dzięki czemu możesz go użyć w funkcji isistance.
źródło
Mogę sobie z tym poradzić w stylu pisania kaczego, jak wspominają inni. Skąd mam wiedzieć, że ciąg jest naprawdę ciągiem? Cóż, oczywiście poprzez konwersję na ciąg!
Jeśli argument jest już ciągiem lub typem Unicode, słowo real_word zachowa swoją wartość bez modyfikacji. Jeśli przekazany obiekt implementuje
__unicode__
metodę, która jest używana do uzyskania jego reprezentacji Unicode. Jeśli przekazany obiekt nie może być użyty jako ciąg znaków,unicode
wbudowane polecenie generuje wyjątek.źródło
będzie Prawda, jeśli Twój obiekt jest rzeczywiście ciągiem znaków. „str” to słowo zastrzeżone.
przepraszam, poprawną odpowiedzią jest użycie „łańcucha bazowego” zamiast „str”, aby zawierał także łańcuchy Unicode - jak zauważono powyżej przez jednego z pozostałych respondentów.
źródło
Tego wieczoru wpadłem na sytuację, w której myślałem, że będę musiał sprawdzić przed
str
typ, ale okazało się, że nie.Moje podejście do rozwiązania problemu będzie prawdopodobnie działało w wielu sytuacjach, dlatego oferuję je poniżej, na wypadek, gdyby inni czytający to pytanie byli zainteresowani (tylko Python 3).
Niektóre testy:
źródło
To proste, użyj następującego kodu (zakładamy, że wspomniany obiekt to obj) -
źródło
Możesz to przetestować, łącząc pusty ciąg:
Edytuj :
Poprawiam moją odpowiedź po komentarzach wskazujących, że nie udaje się to z listami
źródło
Aby uzyskać dobre podejście do pisania w stylu „kaczych znaków”, które ma tę zaletę, że współpracuje zarówno z Pythonem 2.x, jak i 3.x:
mądry był blisko pisania kaczką, zanim przeszedł na
isinstance
podejście, z wyjątkiem tego, że+=
ma inne znaczenie dla list niż+
ma.źródło
isalpha
, ale kto wie, jakich metod można by bezpiecznie szukać?__str__
metoda oraz równość może faktycznie być jeden idiotoodporny. Ale nawet to nie jest bez zastrzeżeń.try
może być szybszy. Jeśli oczekujesz, że 99% czasu, może nie. Różnica w wydajności jest minimalna, lepiej być idiomatycznym, chyba że profilujesz swój kod i nie identyfikujesz go jako wolnego.z EDX - kurs online MITx: 6.00.1x Wprowadzenie do informatyki i programowania za pomocą Pythona
źródło
str
!