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


当前回答

isinstance(your_object, basestring)

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

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

其他回答

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

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

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

Python 3

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

Python 3中的检查。X就是:

isinstance(obj_to_test, str)

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

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

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

编辑:

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

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

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

str(maybe_string) == maybe_string

它不会遍历iterable或迭代器,它不会将字符串列表调用为字符串,它会正确地将类似字符串的对象检测为字符串。

当然也有缺点。例如,str(maybe_string)可能是一个繁重的计算。通常情况下,答案是视情况而定。

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

Python 2

检查对象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。

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