如何检查Python对象是否为字符串(常规或Unicode)?
当前回答
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中检查类型的规范方法是什么?
其他回答
我可能会像其他人提到的那样,用鸭子类型来处理这个问题。我怎么知道一个字符串真的是一个字符串?显然是通过将其转换为字符串!
def myfunc(word):
word = unicode(word)
...
如果arg已经是一个字符串或unicode类型,real_word将保持其值不变。如果传递的对象实现了__unicode__方法,则该方法用于获取其unicode表示。如果传递的对象不能作为字符串使用,unicode内置将引发异常。
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中检查类型的规范方法是什么?
对于类似字符串的良好鸭子类型方法,它具有与Python 2同时使用的好处。X和3.x:
def is_string(obj):
try:
obj + ''
return True
except TypeError:
return False
Wisefish在切换到isinstance方法之前与duck-typing很接近,只是+=对于列表的含义与+不同。
你可以通过连接一个空字符串来测试它:
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中进行热编码?
- 如何嵌入HTML到IPython输出?
- 在Python生成器上使用“send”函数的目的是什么?
- 是否有可能更新一个本地化的故事板的字符串?
- 为什么字符串类型的默认值是null而不是空字符串?
- 是否可以将已编译的.pyc文件反编译为.py文件?
- Django模型表单对象的自动创建日期
- 在Python中包装长行
- 如何计算两个时间串之间的时间间隔
- 我如何才能找到一个Python函数的参数的数量?
- 您可以使用生成器函数来做什么?
- 将Python诗歌与Docker集成
- 提取和保存视频帧
- 使用请求包时出现SSL InsecurePlatform错误
- 如何检索Pandas数据帧中的列数?