Я знаю, что могу использовать: 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"
python
string
python-3.x
python-2.x
Рэндалл Хант
источник
источник
Ответы:
Если вы пишете 2.x-and-3.x-совместимый код, вы, вероятно, захотите использовать шесть :
источник
>>> isinstance(u"foo", string_types)
True
>>> isinstance(u"foo".encode("utf-8"), string_types)
True
Я ожидал, что isinstance (u "foo", string_types) вернет false.str
иunicode
на Python 2, илиstr
на Python 3. Если вы не хотитеunicode
рассчитывать на Python 2, просто используйтеstr
.future
пакета вместоsix
:from future.utils import string_types
Самый краткий подход, который я нашел, не полагаясь на пакеты типа шести, это:
затем, при условии, что вы проверяли строки в Python 2 самым общим способом,
теперь также будет работать для Python 3+.
источник
basestring = (str, bytes)
изrequests/compat.py
if not hasattr(__builtins__, "basestring"): basestring = (str, bytes)
Как насчет этого, работает во всех случаях?
источник
from __future__ import unicode_literals
активный. Теперь я собираюсь с:isinstance(val, (str, u"".__class__))
Это ответ @Lev Левицкого, переписанный немного.
try
/except
Тест выполняется один раз, а затем определяет функцию , которая всегда работает и как можно быстрее.РЕДАКТИРОВАТЬ: На самом деле, нам даже не нужно звонить
isinstance()
; нам просто нужно оценитьbasestring
и посмотреть, получим ли мыNameError
:Я думаю, что легче последовать призыву
isinstance()
, хотя.источник
isinstance("", basestring)
это то, что я имел в виду под «звонить». В любом случае +1.try: string_types = basestring except NameError: string_types = str
future
Библиотека добавляет (в Python 2) совместимые имена , так что вы можете продолжать писать Python 3 . Вы можете просто сделать следующее:Чтобы установить его , просто выполните
pip install future
.В качестве предостережения , он только поддерживает
python>=2.6
,>=3.3
но он более современный, чемsix
, который рекомендуется только при использованииpython 2.5
источник
Может быть, использовать обходной путь, как
источник
isinstance(u'hello', basestr)
уступаетSyntaxError: invalid syntax
мне с Python 3.2.3 под Windows 7 ... есть идеи, почему это будет? Кажется, это не нравитсяu
- я получаю эту ошибкуstr
иbasestr
str
в Python3 по определению Unicode. Соответственно, нетbasestring
типа, следовательно, то,NameError
что поймано в моем фрагменте.try
/except
test один раз, и, основываясь на результатах этого теста, вы определитеisstr()
правильно. Нет необходимости накладывать накладные расходы на исключение для каждого вызоваisstr()
.Вы можете получить класс объекта, вызвав его
object.__class__
, чтобы проверить, является ли объект строковым типом по умолчанию:И Вы можете поместить следующее в верхней части своего кода, чтобы строки, заключенные в кавычки, были в юникоде в python 2:
источник
some_element.text
это 'str', но сравнение с 'unicode' не удастсяВы можете попробовать это в начале вашего кода:
и позже в коде:
источник
Быть осторожен! В питоне 2
str
иbytes
по сути то же самое. Это может вызвать ошибку, если вы пытаетесь различить их.источник
тип (строка) == стр
возвращает true, если это строка, и false, если нет
источник
string
есть строка в