Як перевірити, чи є тип змінної рядком?


766

Чи є спосіб перевірити, чи є тип змінної в python string, наприклад:

isinstance(x,int);

для цілих значень?


11
Якщо ви вивчаєте python canonical.org/~kragen/isinstance, обов'язкове читання на предмет .
кит


Будьте обережні з ints з тих пір isinstance(True, int) is True.
Альберт Тугушев

isinstance(x,str)правильно в Python 3 (str - це базовий тип).
MasterControlProgram

Відповіді:


1137

У Python 2.x ви б це зробили

isinstance(s, basestring)

basestringце абстрактний суперклас з strі unicode. З його допомогою можна перевірити, чи об'єкт є екземпляром strабо unicode.


У Python 3.x правильний тест

isinstance(s, str)

bytesКлас не рахується типом рядка в Python 3.


10
@ Yarin: Ні. Але це не має значення, адже Python 3.x зовсім не призначений для сумісності з Python 2.x.
netcoder

2
Я виявив, що isin substance (s, str) працює з py27, перевірена на: Python 2.7.5 (за замовчуванням, 25 серпня 2013, 00:04:04) [GCC 4.2.1 Сумісний Apple LLVM 5.0 (clang-500.0.68)] на Дарвін.
kakyo

25
@kakyo: Проблема в тому, що вона буде пропускати unicodeоб'єкти, які також слід вважати рядками. І тип, strі тип unicodeмають загальний базовий клас basestring, і це те, що ви хочете перевірити.
Свен Марнах

7
@ Yarin, якщо ви переносите щось від 2.x до 3.x, ви завжди можете призначити його basestring = str.
Джек

9
@AdamErickson Для сумісності з тим, що саме? Це не допомагає сумісності з Python 3, оскільки немає unicodeв Python 3. Моя рекомендація щодо сумісності між Python 2 і 3 полягає у використанні бібліотеки "шість". (Конкретно isintance(s, six.string_types)в цьому випадку)
Свен Марнах

222

Я знаю, що це стара тема, але, будучи першою, показаною в 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,

4
Наприклад, для одного вкладиша:, value_is_string = isinstance(value, str if sys.version_info[0] >= 3 else basestring)де >=передбачається, що будь-який можливий Python 4+ зберігає strкореневий клас для рядків.
Пі-Мельйон

63

У Python 3.x або Python 2.7.6

if type(x) == str:

10
Мені подобається елегантність "if type (x) in (str, unicode):", але я бачу, як PyLint позначає це як "unidiomatic".
eukras

15
Порівняння типів з ==явно відлякує PEP8 і має кілька недоліків на додаток до того, що їх можна вважати "унідіоматичними", наприклад, воно не виявляє примірників підкласів str, які також слід вважати рядками. Якщо ви дійсно хочете перевірити саме тип strі явно виключити підкласи, використовуйте type(x) is str.
Свен Марнах

17

Ви можете зробити:

var = 1
if type(var) == int:
   print('your variable is an integer')

або:

var2 = 'this is variable #2'
if type(var2) == str:
    print('your variable is a string')
else:
    print('your variable IS NOT a string')

сподіваюся, що це допомагає!



11

Редагувати на основі кращої відповіді нижче. Опустіться приблизно 3 відповіді та дізнайтеся про прохолоду базових рядків.

Стара відповідь: слідкуйте за рядками Unicode, які ви можете отримати з декількох місць, включаючи всі COM-дзвінки в Windows.

if isinstance(target, str) or isinstance(target, unicode):

1
Хороший улов. Я не знав про basestring. Згадується про 3 публікації вниз і, здається, краща відповідь.
Вейд Хатлер

6
isinstance()також приймає кортеж як другий аргумент. Тож навіть якби basestringне існувало, ви могли просто використовувати isinstance(target, (str, unicode)).
Martijn Pieters

3
У python 3.5.1, unicodeсхоже, не визначено:NameError: name 'unicode' is not defined
Eric Hu

11

оскільки 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)

4
Або якщо ви теж хочете спіймати байтові рядки:basestring = (str, bytes)
Позначте Викуп

10

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

http://python-future.org/overview.html


1
Дуже дякую! В Інтернеті є десятки різноманітних відповідей, але єдине добре - це. Перший рядок type('foo')є unicodeтиповим у python 2, а другий str- екземпляром unicode. Thoses робить код дійсним у Python 2 та 3. Ще раз дякую!
Наранн

9

Також хочу зазначити, що якщо ви хочете перевірити, чи є тип змінної конкретного виду, ви можете порівняти тип змінної з типом відомого об'єкта.

Для рядка ви можете використовувати це

type(s) == type('')

7
Це жахливий, жахливий спосіб ввести перевірку в python. Що робити, якщо інший клас успадковує str? Що з рядками Unicode, які навіть не успадковують з str2.x? Використовувати isinstance(s, basestring)в 2.x або isinstance(s, str)3.x.
Джек

1
@Jack, будь ласка, прочитайте питання, а також зауважте, що я не пишу, що це найкращий спосіб, просто інший спосіб.
Даніїл Гранкін

9
Це погана ідея з 3 причин: isinstance()допускає підкласи (які також є рядками, просто спеціалізованими), додатковий type('')виклик є зайвим, коли ви можете просто використовувати, strа типи - одиночні, тому type(s) is strбуде більш ефективним тестом.
Мартійн Пітерс

8

Тут є багато хороших пропозицій, але я не бачу хорошого резюме на платформі. Наступне має бути хорошим результатом для будь-якої програми 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.


1
Це, ймовірно, зламається в Python 4, врахуйте >=принаймні.
thakis

2
бути чистішим, щоб перевірити наявність шість.string_types або six.text_type
даонб

@daonb імпортує цілий модуль лише для того, щоб зробити однолінійний тест - це мислення, яке змушує звести з розуму дерева залежностей і серйозний роздув, що має бути чимось коротким малим і простим. Це ваш дзвінок, звичайно, але просто скажіть ...
дуанев

@duanev, якщо ви переживаєте про сумісність Python 2/3, краще все-таки використовувати шість у проекті. Шість - це також єдиний файл, тому дерева залежностей / загострення тут не є проблемою.
MoxieBall

7

Альтернативний спосіб для Python 2, без використання базових рядків:

isinstance(s, (str, unicode))

Але все ще не буде працювати в Python 3, оскільки unicodeвін не визначений (у Python 3).


7

Тому,

У вас є багато варіантів, щоб перевірити, чи є ваша змінна рядок чи ні:

a = "my string"
type(a) == str # first 
a.__class__ == str # second
isinstance(a, str) # third
str(a) == a # forth
type(a) == type('') # fifth

Цей наказ призначений за призначенням.


5
a = '1000' # also tested for 'abc100', 'a100bc', '100abc'

isinstance(a, str) or isinstance(a, unicode)

повертає True

type(a) in [str, unicode]

повертає True


Для Python 2.7.12 мені довелося видалити лапки: введіть (a) у [str, unicode]
Адам Еріксон,

4

Ось моя відповідь на підтримку Python 2 та Python 3 разом із цими вимогами:

  • Написано в Py3-коді з мінімальним кодом Py2 compat.
  • Пізніше видаліть кодовий пакет Py2 без зривів. Тобто націлена лише на видалення, без зміни коду Py3.
  • Уникайте використання sixабо подібного модуля compat, оскільки вони, як правило, приховують те, що намагаються досягти.
  • Майбутнє для потенційного Py4.

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)

1

Якщо ви не хочете залежати від зовнішніх ліб, це працює як для 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");

1

Ви можете просто скористатися функцією isin substance, щоб переконатися, що вхідні дані є форматними рядками або unicode . Нижче приклади допоможуть вам легко зрозуміти.

>>> isinstance('my string', str)
True
>>> isinstance(12, str)
False
>>> isinstance('my string', unicode)
False
>>> isinstance(u'my string',  unicode)
True


-6

Ось як я це роблю:

if type(x) == type(str()):

4
type(str())дуже крутий спосіб висловлювання str. Типи є однотонними, тому type(x) is strефективніше. isinstance()слід використовувати замість цього, якщо у вас є дуже вагомі причини ігнорувати підкласи str.
Martijn Pieters

якщо тип (x) є str:
shaurya uppal


-13
>>> thing = 'foo'
>>> type(thing).__name__ == 'str' or type(thing).__name__ == 'unicode'
True

2
У якому випадку ви віддасте перевагу type(thing).__name__ == 'str'над type(thing) == strабо isinstance(thing, str)? Також unicodeне існує в сучасних версіях Python.
vaultah
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.