Чи є спосіб перевірити, чи є тип змінної в 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, які навіть не успадковують з str2.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.