Як я можу перевірити, чи об'єктом Python є рядок (звичайний чи Unicode)?
Як я можу перевірити, чи об'єктом Python є рядок (звичайний чи Unicode)?
Відповіді:
Щоб перевірити, чи об'єкт o
є рядковим типом підкласу типу рядка:
isinstance(o, basestring)
тому що обидва str
і unicode
є підкласами basestring
.
Щоб перевірити, чи o
точно тип str
:
type(o) is str
Щоб перевірити, чи o
є примірником str
або будь-яким підкласом str
:
isinstance(o, str)
Вищезазначене також працює для рядків Unicode, якщо ви замінили str
на unicode
.
Однак вам може не потрібно взагалі робити явну перевірку типу. "Введення качки" може відповідати вашим потребам. Див. Http://docs.python.org/glossary.html#term-duck-typing .
Дивіться також Який канонічний спосіб перевірити тип python?
basestring
в py2.
У Python 3.x basestring
більше не доступний, як str
і єдиний тип рядка (із семантикою Python 2.x's unicode
).
Тож перевірка в Python 3.x просто:
isinstance(obj_to_test, str)
З цього випливає виправлення офіційного 2to3
інструменту перетворення: перетворення basestring
в str
.
Якщо ви хочете перевірити версію Python (2.x проти 3.x), використовуйте six
( PyPI ) та його string_types
атрибут:
import six
if isinstance(obj, six.string_types):
print('obj is a string!')
Всередині six
(дуже легкий однофайловий модуль) це просто так :
import sys
PY3 = sys.version_info[0] == 3
if PY3:
string_types = str
else:
string_types = basestring
future
( PyPI ), щоб навіть зберегти ім'я:from past.builtins import basestring
basestring
а потім поверніться до str
. Напр.def is_string(obj): try: return isinstance(obj, basestring) # python 2 except NameError: return isinstance(obj, str) # python 3
Я знайшов це та більше pythonic
:
if type(aObject) is str:
#do your stuff here
pass
оскільки об'єкти типу є Сінглтоном, це може використовуватися , щоб зробити порівняння об'єкта з типом ули
isinstance(obj_to_test, str)
очевидно, призначений для тестування на тип, і він має перевагу в застосуванні тієї ж процедури, що і для інших випадків, що не належать до рядків.
Якщо ви хочете триматися подалі від явної перевірки типу (і є вагомі причини, щоб утримуватися від неї), мабуть, найбезпечнішою частиною рядкового протоколу для перевірки є:
str(maybe_string) == maybe_string
Він не повториться за допомогою ітератора чи ітератора, він не буде називати список рядків рядком і він правильно визначає схожий на рядок як рядок.
Звичайно, є і недоліки. Наприклад, str(maybe_string)
може бути важкий розрахунок. Як це часто, відповідь - це залежить .
EDIT: Як в коментарях вказує @Tcll , питання насправді вимагає способу виявлення як рядків unicode, так і bytestrings. На Python 2 ця відповідь буде невдалою, за винятком рядків Unicode, що містять символи, що не належать до ASCII, а на Python 3 повернеться False
для всіх байтов.
b = b'test'; r = str(b) == b
там, де b
зберігаються ті самі дані, що і, str(b)
але (будучи об'єктом байтів), не перевіряється як рядок.
Для того, щоб перевірити, чи є ваша змінна чимось:
s='Hello World'
if isinstance(s,str):
#do something here,
Вихід опору дасть вам булеве значення True або False, щоб ви могли відповідно налаштувати. Ви можете перевірити очікувану абревіатуру вашої величини, спочатку скориставшись: type (s) Це поверне вам тип "str", щоб ви могли використовувати його у функції isistance.
Я можу мати справу з цим у стилі набору качки, як і інші згадки. Як дізнатись, що струна - це дійсно рядок? ну, очевидно, перетворивши його на рядок!
def myfunc(word):
word = unicode(word)
...
Якщо аргумент - це вже рядок або тип унікоду, real_word утримуватиме його значення без змін. Якщо переданий об'єкт реалізує __unicode__
метод, який використовується для отримання його уявлення унікоду. Якщо переданий об'єкт не може бути використаний як рядок, unicode
вбудований створює виняток.
isinstance(your_object, basestring)
буде правдою, якщо ваш об’єкт справді є рядковим. 'str' - це зарезервоване слово.
мої вибачення, правильна відповідь використовує 'basestring' замість 'str' для того, щоб він також включав рядки unicode, - як вище зазначав один з інших респондентів.
Цього вечора я зіткнувся з ситуацією, в якій я думав, що мені доведеться перевірити str
тип, але виявилося, що я цього не зробив.
Мій підхід до вирішення проблеми, ймовірно, спрацює у багатьох ситуаціях, тому я пропоную його нижче, якщо зацікавлені інші, хто читає це питання (лише для Python 3).
# NOTE: fields is an object that COULD be any number of things, including:
# - a single string-like object
# - a string-like object that needs to be converted to a sequence of
# string-like objects at some separator, sep
# - a sequence of string-like objects
def getfields(*fields, sep=' ', validator=lambda f: True):
'''Take a field sequence definition and yield from a validated
field sequence. Accepts a string, a string with separators,
or a sequence of strings'''
if fields:
try:
# single unpack in the case of a single argument
fieldseq, = fields
try:
# convert to string sequence if string
fieldseq = fieldseq.split(sep)
except AttributeError:
# not a string; assume other iterable
pass
except ValueError:
# not a single argument and not a string
fieldseq = fields
invalid_fields = [field for field in fieldseq if not validator(field)]
if invalid_fields:
raise ValueError('One or more field names is invalid:\n'
'{!r}'.format(invalid_fields))
else:
raise ValueError('No fields were provided')
try:
yield from fieldseq
except TypeError as e:
raise ValueError('Single field argument must be a string'
'or an interable') from e
Деякі тести:
from . import getfields
def test_getfields_novalidation():
result = ['a', 'b']
assert list(getfields('a b')) == result
assert list(getfields('a,b', sep=',')) == result
assert list(getfields('a', 'b')) == result
assert list(getfields(['a', 'b'])) == result
Його просто, використовуйте наступний код (ми вважаємо, що об'єкт, згаданий як obj) -
if type(obj) == str:
print('It is a string')
else:
print('It is not a string.')
Ви можете перевірити це, об'єднавшись із порожнім рядком:
def is_string(s):
try:
s += ''
except:
return False
return True
Редагувати :
Виправляючи мою відповідь після коментарів, вказуючи, що це не відповідає спискам
def is_string(s):
return isinstance(s, basestring)
За гарний підхід для набору качок для струнних лайків, який має премію роботи з Python 2.x та 3.x:
def is_string(obj):
try:
obj + ''
return True
except TypeError:
return False
мудрі рибки були близькими з типом качки, перш ніж він перейшов на isinstance
підхід, за винятком того +=
, що для списків має інше значення, ніж +
це.
isalpha
, але хто знає, які методи було б безпечно шукати?
try
може бути швидше. Якщо ви очікуєте цього 99% часу, можливо, ні. Різниця в продуктивності мінімальна, краще бути ідіоматичним, якщо ви не профіліруєте код і не визначите його як насправді повільний.
if type(varA) == str or type(varB) == str:
print 'string involved'
від EDX - онлайн-курс MITx: 6.00.1x Вступ до інформатики та програмування за допомогою Python
str
!