如何找出一个Python对象是否为字符串?

如何检查Python对象是否为字符串(常规或Unicode)?

399423 次浏览

Python 2

对测试对象obj使用isinstance(obj, basestring)

文档

Python 2

检查对象o是否为字符串类型的子类的字符串类型:

isinstance(o, basestring)

因为strunicode都是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

另见在python中检查类型的规范方法是什么?

我可能会像其他人提到的那样,用鸭子类型来处理这个问题。我怎么知道一个字符串真的是一个字符串?很明显,通过转换它变成了一个字符串!

def myfunc(word):
word = unicode(word)
...

如果arg已经是一个字符串或unicode类型,real_word将保持其值不变。如果传递的对象实现了__unicode__方法,则该方法用于获取其unicode表示形式。如果传递的对象不能作为字符串使用,unicode内置将引发异常。

你可以通过连接一个空字符串来测试它:

def is_string(s):
try:
s += ''
except:
return False
return True

编辑:

更正我的回答后的评论指出,这失败与列表

def is_string(s):
return isinstance(s, basestring)
isinstance(your_object, basestring)

如果对象确实是字符串类型,则为True。'str'是保留字。

< p >我的道歉, 正确的答案是使用'basestring'而不是'str',以便它也包括unicode字符串-正如上面其他应答者之一所指出的那样

Python 2和3

(cross-compatible)

如果你想检查不考虑Python版本(2。x vs . 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
if type(varA) == str or type(varB) == str:
print 'string involved'
< p >从 EDX -在线课程 MITx: 6.00.1x使用Python的计算机科学与编程简介

Python 3

在Python 3中。basestring不再可用,因为str是唯一的字符串类型(具有Python 2. x的语义)。x unicode)。

Python 3中的检查。X就是:

isinstance(obj_to_test, str)

这遵循官方2to3转换工具的修复:将basestring转换为str

对于类似字符串的良好鸭子类型方法,它具有与Python 2同时使用的好处。X和3.x:

def is_string(obj):
try:
obj + ''
return True
except TypeError:
return False

在他切换到isinstance方法之前,wisefish与duck-typing很接近,除了+=对于列表的含义与+不同。

我发现这个更pythonic:

if type(aObject) is str:
#do your stuff here
pass

因为类型对象是单例的,所以可以用来比较对象和str类型

为了检查你的变量是不是你可以这样做:

s='Hello World'
if isinstance(s,str):
#do something here,
isist0的输出将给你一个布尔值True或False,这样你可以相应地调整。 你可以通过以下方法检查你的值的首字母缩写: 类型(年代) 这将返回您键入'str',以便您可以在isistance函数中使用它

如果有人想要远离显式类型检查(并且有很好的理由远离它),可能字符串协议中最安全的检查部分是:

str(maybe_string) == maybe_string

它不会遍历iterable或迭代器,它不会将字符串列表调用为字符串,并且它正确地将stringlike检测为字符串。

当然也有缺点。例如,str(maybe_string)可能是一个繁重的计算。通常,答案是这取决于

编辑:正如注释中的@Tcll 指出的那样一样,这个问题实际上要求一种同时检测unicode字符串和字节字符串的方法。在Python 2上,这个答案将失败,对于包含非ascii字符的unicode字符串会出现异常,在Python 3上,它将为所有字节字符串返回False

今天晚上,我遇到了一种情况,我认为,我将不得不检查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.')

我认为可以安全地假设,如果repr()输出的最后一个字符是'",那么无论它是什么,它都可以被认为是某种字符串。

def isStr(o):
return repr(o)[-1] in '\'"'

我假设repr不会做任何太繁重的事情,它将返回一个至少有一个字符的字符串。您可以使用类似的方法来支持空字符串

repr(o)[-1:].replace('"', "'") == "'"

但这仍然假设repr返回一个字符串。