Чи є спосіб перевірити, чи є тип змінної в 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, і зважаючи на те, що жоден із відповідей не вважаю задовільним, я залишаю це для подальшої довідки:
6 - бібліотека сумісності 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
.
Модуль типу також існує, якщо ви перевіряєте більше, ніж ints та string. 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, включаючи unicode
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
? Що з рядками Unicode, які навіть не успадковують з 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 чи a 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");
Ви можете просто скористатися функцією isin substance, щоб переконатися, що вхідні дані є форматними рядками або unicode . Нижче приклади допоможуть вам легко зрозуміти.
>>> 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.