Как проверить, является ли переменная строкой с совместимостью с python 2 и 3

Я знаю, что могу использовать: 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"

Ответ 1

Если вы пишете 2.x-и-3.x-совместимый код, вы, вероятно, захотите использовать six

from six import string_types
isinstance(s, string_types)

Ответ 2

Самый сложный подход, который я нашел, не полагаясь на такие пакеты, как шесть:

try:
  basestring
except NameError:
  basestring = str

то, предположив, что вы проверяете строки в Python 2 наиболее общим образом,

isinstance(s, basestring)

теперь также будет работать для Python 3 +.

Ответ 3

Как насчет этого, работает во всех случаях?

isinstance(x, ("".__class__, u"".__class__))

Ответ 4

Это ответ @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().

Ответ 5

Библиотека future добавляет (в Python 2) совместимые имена, поэтому вы можете продолжить писать Python 3. Вы можете просто сделать следующее:

from builtins import str
isinstance(x, str) 

Чтобы установить его, просто выполните pip install future.

В качестве предупреждения, он поддерживает только python>=2.6, >=3.3, но он более современный, чем six, который рекомендуется только при использовании python 2.5

Ответ 6

Возможно, используйте обходной путь, например

def isstr(s):
    try:
        return isinstance(s, basestring)
    except NameError:
        return isinstance(s, str)

Ответ 7

Вы можете получить класс объекта, вызвав object.__class__, поэтому, чтобы проверить, является ли объект строковым типом по умолчанию:

    isinstance(object,"".__class__)

И вы можете разместить следующее в верхней части вашего кода, чтобы строки, заключенные в кавычки, были в юникоде в python 2:

    from __future__ import unicode_literals

Ответ 8

Вы можете попробовать это в начале вашего кода:

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")

Ответ 9

Быть осторожен! В python 2 str и bytes по сути одинаковы. Это может вызвать ошибку, если вы пытаетесь различить их.

>>> size = 5    
>>> byte_arr = bytes(size)
>>> isinstance(byte_arr, bytes)
True
>>> isinstance(byte_arr, str)
True

Ответ 10

type (string) == str

возвращает true, если его строка, а false, если не