Ответ 1
Если вы пишете 2.x-и-3.x-совместимый код, вы, вероятно, захотите использовать six
from six import string_types
isinstance(s, string_types)
Я знаю, что могу использовать: isinstance(x, str)
в python-3.x, но мне нужно проверить, является ли что-то строкой в python-2.x. Будет ли isinstance(x, str)
работать должным образом в python-2.x? Или мне нужно будет проверить версию и использовать isinstance(x, basestr)
?
В частности, в python-2.x:
>>>isinstance(u"test", str)
False
и python-3.x не имеет u"foo"
Если вы пишете 2.x-и-3.x-совместимый код, вы, вероятно, захотите использовать six
from six import string_types
isinstance(s, string_types)
Самый сложный подход, который я нашел, не полагаясь на такие пакеты, как шесть:
try:
basestring
except NameError:
basestring = str
то, предположив, что вы проверяете строки в Python 2 наиболее общим образом,
isinstance(s, basestring)
теперь также будет работать для Python 3 +.
Как насчет этого, работает во всех случаях?
isinstance(x, ("".__class__, u"".__class__))
Это ответ @Lev Levitsky, переписанный немного.
try:
isinstance("", basestring)
def isstr(s):
return isinstance(s, basestring)
except NameError:
def isstr(s):
return isinstance(s, str)
Тест try
/except
выполняется один раз, а затем определяет функцию, которая всегда работает и как можно быстрее.
EDIT: На самом деле нам даже не нужно вызывать isinstance()
; нам просто нужно оценить basestring
и посмотреть, получим ли мы NameError
:
try:
basestring # attempt to evaluate basestring
def isstr(s):
return isinstance(s, basestring)
except NameError:
def isstr(s):
return isinstance(s, str)
Я думаю, что легче следовать при вызове isinstance()
.
Библиотека future
добавляет (в Python 2) совместимые имена, поэтому вы можете продолжить писать Python 3. Вы можете просто сделать следующее:
from builtins import str
isinstance(x, str)
Чтобы установить его, просто выполните pip install future
.
В качестве предупреждения, он поддерживает только python>=2.6
, >=3.3
, но он более современный, чем six
, который рекомендуется только при использовании python 2.5
Возможно, используйте обходной путь, например
def isstr(s):
try:
return isinstance(s, basestring)
except NameError:
return isinstance(s, str)
Вы можете получить класс объекта, вызвав object.__class__
, поэтому, чтобы проверить, является ли объект строковым типом по умолчанию:
isinstance(object,"".__class__)
И вы можете разместить следующее в верхней части вашего кода, чтобы строки, заключенные в кавычки, были в юникоде в python 2:
from __future__ import unicode_literals
Вы можете попробовать это в начале вашего кода:
from __future__ import print_function
import sys
if sys.version[0] == "2":
py3 = False
else:
py3 = True
if py3:
basstring = str
else:
basstring = basestring
и позже в коде:
anystring = "test"
# anystring = 1
if isinstance(anystring, basstring):
print("This is a string")
else:
print("No string")
Быть осторожен! В python 2 str
и bytes
по сути одинаковы. Это может вызвать ошибку, если вы пытаетесь различить их.
>>> size = 5
>>> byte_arr = bytes(size)
>>> isinstance(byte_arr, bytes)
True
>>> isinstance(byte_arr, str)
True
type (string) == str
возвращает true, если его строка, а false, если не