Wiem, że mogę używać: isinstance(x, str)
w python-3.x, ale muszę sprawdzić, czy coś jest ciągiem znaków również w python-2.x. Będzie isinstance(x, str)
działać zgodnie z oczekiwaniami w Pythonie-2.x? A może będę musiał sprawdzić wersję i użyć isinstance(x, basestr)
?
W szczególności w pythonie-2.x:
>>>isinstance(u"test", str)
False
a python-3.x nie ma u"foo"
python
string
python-3.x
python-2.x
Randall Hunt
źródło
źródło
Odpowiedzi:
Jeśli piszesz kod kompatybilny z 2.xi 3.x, prawdopodobnie będziesz chciał użyć sześciu :
źródło
>>> isinstance(u"foo", string_types)
True
>>> isinstance(u"foo".encode("utf-8"), string_types)
True
Spodziewałem się, że isinstance (u "foo", string_types) zwróci false.str
iunicode
Pythona 2 lubstr
Pythona 3. Jeśli nie chceszunicode
liczyć na Python 2, po prostu użyjstr
.future
pakietu zamiastsix
:from future.utils import string_types
Najbardziej zwięzłe podejście, które znalazłem bez polegania na pakietach takich jak sześć, to:
to zakładając, że sprawdzałeś ciągi znaków w Pythonie 2 w najbardziej ogólny sposób,
będzie teraz działać również dla Pythona 3+.
źródło
basestring = (str, bytes)
odrequests/compat.py
if not hasattr(__builtins__, "basestring"): basestring = (str, bytes)
A co z tym, działa we wszystkich przypadkach?
źródło
from __future__ import unicode_literals
aktywny. Teraz jadę z:isinstance(val, (str, u"".__class__))
To jest odpowiedź @Lev Levitsky, trochę przepisana.
try
/except
Test odbywa się raz, a następnie definiuje funkcję, która zawsze działa i jest tak szybko, jak to możliwe.EDYCJA: Właściwie nie musimy nawet dzwonić
isinstance()
; musimy tylko ocenićbasestring
i sprawdzić, czy otrzymamyNameError
:Myślę jednak, że łatwiej jest podążać za wezwaniem
isinstance()
.źródło
isinstance("", basestring)
to właśnie miałem na myśli mówiąc „dzwonienie”. W każdym razie +1.try: string_types = basestring except NameError: string_types = str
future
Biblioteka dodaje (Python 2) kompatybilnych nazw , więc można kontynuować pisanie Python 3 . Możesz w prosty sposób wykonać następujące czynności:Aby go zainstalować , po prostu wykonaj
pip install future
.Jako zastrzeżenie , to tylko wsparcie
python>=2.6
,>=3.3
ale to jest bardziej niż nowoczesnysix
, który jest jedynie zalecana w przypadku korzystaniapython 2.5
źródło
Może użyj obejścia takiego jak
źródło
isinstance(u'hello', basestr)
dajeSyntaxError: invalid syntax
mi to w Pythonie 3.2.3 pod Window 7 .. masz pojęcie, dlaczego tak się dzieje? Wygląda na to, że nie podoba mi sięu
- dostaję ten błąd zstr
ibasestr
str
w Pythonie3 jest z definicji Unicode. W związku z tym nie mabasestring
typu, stądNameError
to jest złapane w moim fragmencie.try
/except
test jeden raz i na podstawie wyników tego pojedynczego testuisstr()
poprawnie zdefiniujesz . Nie ma potrzeby ponoszenia narzutu w postaci wyjątku dla każdego wywołaniaisstr()
.Możesz pobrać klasę obiektu, wywołując
object.__class__
, więc aby sprawdzić, czy obiekt jest domyślnym typem ciągu:I możesz umieścić następujący kod na górze swojego kodu, aby ciągi w cudzysłowach były w formacie Unicode w Pythonie 2:
źródło
some_element.text
jest „str”, ale porównanie z „unicode” nie powiedzie sięMożesz spróbować tego na początku swojego kodu:
a później w kodzie:
źródło
Bądź ostrożny! W Pythonie 2
str
ibytes
są zasadniczo takie same. Może to spowodować błąd, jeśli próbujesz je rozróżnić.źródło
type (string) == str
zwraca prawdę, jeśli jest to ciąg znaków, a fałsz, jeśli nie
źródło
string
jest ciąg znaków Unicode