Есть ли способ проверить, является ли тип переменной в Python string
, как:
isinstance(x,int);
для целочисленных значений?
isinstance(True, int) is True
.
isinstance(x,str)
правильно в Python 3 (str является базовым типом).
Есть ли способ проверить, является ли тип переменной в Python string
, как:
isinstance(x,int);
для целочисленных значений?
isinstance(True, int) is True
.
isinstance(x,str)
правильно в Python 3 (str является базовым типом).
Ответы:
В Python 2.x вы бы сделали
isinstance(s, basestring)
basestring
это абстрактный суперкласс из str
и unicode
. Его можно использовать для проверки того, является ли объект экземпляром str
или unicode
.
В Python 3.x правильный тест
isinstance(s, str)
bytes
Класс не считается типом строки в Python 3.
unicode
объекты, которые также должны рассматриваться как строки. И тип, str
и тип unicode
имеют общий базовый класс basestring
, и это то, что вы хотите проверить.
basestring = str
.
unicode
в Python 3 его нет. Моя рекомендация по совместимости между Python 2 и 3 - использовать библиотеку «шести». (Конкретно isintance(s, six.string_types)
в этом случае)
Я знаю, что это старая тема, но, будучи первой, показанной в Google и учитывая, что я не нашел ни одного из ответов, удовлетворительных, я оставлю это здесь для дальнейшего использования:
six - это библиотека совместимости Python 2 и 3, которая уже охватывает эту проблему. Затем вы можете сделать что-то вроде этого:
import six
if isinstance(value, six.string_types):
pass # It's a string !!
Проверяя код, вот что вы найдете:
import sys
PY3 = sys.version_info[0] == 3
if PY3:
string_types = str,
else:
string_types = basestring,
value_is_string = isinstance(value, str if sys.version_info[0] >= 3 else basestring)
где >=
предполагается, что любой возможный Python 4+ сохраняет str
корневой класс для строк.
В Python 3.x или Python 2.7.6
if type(x) == str:
==
явным образом не поощряется PEP8 и имеет несколько недостатков, которые также считаются «однотипными», например, он не обнаруживает экземпляры подклассов str
, которые также должны рассматриваться как строки. Если вы действительно хотите точно проверить тип str
и явно исключить подклассы, используйте type(x) is str
.
Модуль типа также существует, если вы проверяете больше, чем целые и строки. http://docs.python.org/library/types.html
types.StringTypes
.
Редактировать на основе лучшего ответа ниже. Пройдите около 3 ответов и узнайте о крутизне базовых строк.
Старый ответ: следите за строками Unicode, которые вы можете получить из нескольких мест, включая все вызовы COM в Windows.
if isinstance(target, str) or isinstance(target, unicode):
isinstance()
также принимает кортеж в качестве второго аргумента. Так что даже если basestring
бы не было, вы могли бы просто использовать isinstance(target, (str, unicode))
.
unicode
кажется, не определены:NameError: name 'unicode' is not defined
поскольку basestring
он не определен в Python3, этот маленький трюк может помочь сделать код совместимым:
try: # check whether python knows about 'basestring'
basestring
except NameError: # no, it doesn't (it's Python3); use 'str' instead
basestring=str
после этого вы можете запустить следующий тест на Python2 и Python3
isinstance(myvar, basestring)
basestring = (str, bytes)
Python 2/3, включая Юникод
from __future__ import unicode_literals
from builtins import str # pip install future
isinstance('asdf', str) # True
isinstance(u'asdf', str) # True
type('foo')
быть unicode
по умолчанию в Python 2, а вторая один маркой str
является экземпляром unicode
. Thoses делает код действительным в Python 2 и 3. Еще раз спасибо!
Также я хочу заметить, что если вы хотите проверить, является ли тип переменной конкретным видом, вы можете сравнить тип переменной с типом известного объекта.
Для строки вы можете использовать это
type(s) == type('')
str
? А как насчет строк Юникода, которые даже не наследуются str
в 2.x? Используйте isinstance(s, basestring)
в 2.x или isinstance(s, str)
в 3.x.
isinstance()
учитывает подклассы (которые тоже являются строками, только специализированные), дополнительный type('')
вызов избыточен, когда вы можете просто его использовать, str
а типы являются одиночными, поэтому type(s) is str
это будет более эффективный тест.
Здесь много хороших предложений от других, но я не вижу хорошего кроссплатформенного резюме. Следующее должно быть хорошим дополнением для любой программы Python:
def isstring(s):
# if we use Python 3
if (sys.version_info[0] >= 3):
return isinstance(s, str)
# we use Python 2
return isinstance(s, basestring)
В этой функции мы используем, isinstance(object, classinfo)
чтобы увидеть, является ли наш ввод str
в Python 3 или basestring
в Python 2.
>=
хотя бы.
a = '1000' # also tested for 'abc100', 'a100bc', '100abc'
isinstance(a, str) or isinstance(a, unicode)
возвращает True
type(a) in [str, unicode]
возвращает True
Вот мой ответ для поддержки Python 2 и Python 3 вместе с этими требованиями:
six
или аналогичного модуля Compat, так как они имеют тенденцию скрывать то, что пытаются достичь.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)
Если вы не хотите зависеть от внешних библиотек, это работает как для Python 2.7+, так и для Python 3 ( http://ideone.com/uB4Kdc ):
# your code goes here
s = ["test"];
#s = "test";
isString = False;
if(isinstance(s, str)):
isString = True;
try:
if(isinstance(s, basestring)):
isString = True;
except NameError:
pass;
if(isString):
print("String");
else:
print("Not String");
Вы можете просто использовать функцию isinstance, чтобы убедиться, что входные данные имеют форматную строку или юникод . Приведенные ниже примеры помогут вам легко понять.
>>> isinstance('my string', str)
True
>>> isinstance(12, str)
False
>>> isinstance('my string', unicode)
False
>>> isinstance(u'my string', unicode)
True
s = '123'
issubclass(s.__class__, str)
Вот как я это делаю:
if type(x) == type(str()):
type(str())
это очень окольный способ сказать str
. Типы являются синглетонами, поэтому type(x) is str
более эффективны. isinstance()
следует использовать вместо, если у вас нет очень веских причин игнорировать подклассы str
.
Я видел:
hasattr(s, 'endswith')
>>> thing = 'foo'
>>> type(thing).__name__ == 'str' or type(thing).__name__ == 'unicode'
True
type(thing).__name__ == 'str'
более type(thing) == str
или isinstance(thing, str)
? Также unicode
не существует в современных версиях Python.