如何检查Python对象是否为字符串(常规或Unicode)?
答案 0 :(得分:292)
答案 1 :(得分:151)
检查对象o
是否是字符串类型的子类的字符串类型:
isinstance(o, basestring)
因为str
和unicode
都是basestring
的子类。
要检查o
的类型是否正好str
:
type(o) is str
要检查o
是str
的实例还是str
的任何子类:
isinstance(o, str)
如果您将str
替换为unicode
,则上述内容也适用于Unicode字符串。
但是,您可能根本不需要进行显式类型检查。 “鸭子打字”可能适合您的需求。请参阅http://docs.python.org/glossary.html#term-duck-typing。
答案 2 :(得分:129)
在Python 3.x basestring
不再可用,因为str
是唯一的字符串类型(具有Python 2.x的unicode
的语义)。
因此,Python 3.x中的检查只是:
isinstance(obj_to_test, str)
这是the fix官方2to3
转换工具的结果:将basestring
转换为str
。
答案 3 :(得分:85)
如果您想检查不考虑Python版本(2.x vs 3.x),请使用six
(PyPI)及其string_types
属性:
import six
if isinstance(obj, six.string_types):
print('obj is a string!')
在six
(一个非常轻量级的单文件模块)中,它只是在做this:
import sys
PY3 = sys.version_info[0] == 3
if PY3:
string_types = str
else:
string_types = basestring
答案 4 :(得分:11)
我发现这个更多pythonic
:
if type(aObject) is str:
#do your stuff here
pass
由于类型对象是单例,是可用于将对象与str类型进行比较
答案 5 :(得分:11)
为了检查你的变量是否适合你:
s='Hello World'
if isinstance(s,str):
#do something here,
isistance的输出将为您提供布尔值True或False值,以便您可以相应地进行调整。 您可以通过以下方式检查您的值的预期首字母缩略词: 类型 这将使您返回键入' str'所以你可以在isistance函数中使用它。
答案 6 :(得分:11)
如果有人想远离明确的类型检查( 远离它的好理由),可能要检查的字符串协议中最安全的部分是:
str(maybe_string) == maybe_string
它不会迭代迭代或迭代器,它不会将字符串列表调用为字符串,而是正确地将stringlike检测为字符串。
当然有缺点。例如,str(maybe_string)
可能是一个繁重的计算。通常情况下,答案是取决于。
答案 7 :(得分:5)
我可能会像其他人提到的那样以鸭子打字的方式处理这个问题。我怎么知道字符串真的是一个字符串?好吧,显然是通过将转换为字符串!
def myfunc(word):
word = unicode(word)
...
如果arg已经是字符串或unicode类型,则real_word将保持其值不被修改。如果传递的对象实现了__unicode__
方法,则用于获取其unicode表示。如果传递的对象不能用作字符串,则unicode
内置引发异常。
答案 8 :(得分:3)
isinstance(your_object, basestring)
如果您的对象确实是字符串类型,则将为True。 'str'是保留字。
我道歉, 正确答案是使用'basestring'而不是'str'按顺序包含unicode字符串 - 正如上面其他一位响应者所说的那样。答案 9 :(得分:3)
很简单,使用下面的代码(我们假设提到的对象是obj)-
if type(obj) == str:
print('It is a string')
else:
print('It is not a string.')
答案 10 :(得分:1)
您可以通过连接空字符串来测试它:
def is_string(s):
try:
s += ''
except:
return False
return True
修改强>:
在评论指出这与列表
失败后,纠正我的回答def is_string(s):
return isinstance(s, basestring)
答案 11 :(得分:1)
今天晚上我遇到了一种情况,我想到我将不得不检查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
答案 12 :(得分:-1)
对于类似于字符串的精美鸭子类型方法,可以使用Python 2.x和3.x:
def is_string(obj):
try:
obj + ''
return True
except TypeError:
return False
在切换到isinstance
方法之前, wisefish与鸭子打字很接近,除了+=
对列表的含义与+
不同。
答案 13 :(得分:-4)
if type(varA) == str or type(varB) == str:
print 'string involved'
这 EDX - 在线课程 MITx:6.00.1x计算机科学概论和使用Python编程