【问题标题】:Use isinstance to test for Unicode string使用 isinstance 测试 Unicode 字符串
【发布时间】:2014-07-01 16:09:44
【问题描述】:

我该怎么做:

>>> s = u'hello'
>>> isinstance(s,str)
False

但我希望 isinstance 为这个 Unicode 编码字符串返回 True。有 Unicode 字符串对象类型吗?

【问题讨论】:

  • type(s) 会很容易地告诉您类型...但是您为什么要进行类型检查?你真的只在寻找unicode 对象,还是任何具有类似字符串接口的东西?

标签: python unicode typechecking


【解决方案1】:

是否有 Unicode 字符串对象类型?

是的,这行得通:

>>> s = u'hello'
>>> isinstance(s, unicode)
True
>>>

不过,这只有在您知道它是 unicode 时才有用。 另一种解决方案是使用six 包,它可以让您免于python2.x 和python3.x 转换并捕获unicodestr

>>> unicode_s = u'hello'
>>> s = 'hello'
>>> isinstance(unicode_s, str)
False
>>> isinstance(unicode_s, unicode)
True
>>> isinstance(s, str)
True
>>> isinstance(unicode_s, str)
False
>>> isinstance(s, six.string_types)
True
>>> isinstance(unicode_s, six.string_types)
True

【讨论】:

  • 正是我想要的。如果你想让代码兼容 python2 和 3.
【解决方案2】:

对于Python2,您可以使用basestring 来测试both

isinstance(unicode_or_bytestring, basestring)

basestring 仅在 Python 2 中可用,并且是 strunicode 的抽象基类型。

如果你想测试 just unicode,那么明确地这样做:

isinstance(unicode_tring, unicode)

对于 Python 3,仅测试 str

isinstance(unicode_or_bytestring, str)

或者,如果您必须处理字节串,请单独测试bytes

isinstance(unicode_or_bytestring, bytes)

这两种类型是故意不可互换的;使用显式编码(strbytes)和解码(bytesstr)在类型之间进行转换。

【讨论】:

  • @Anthony:确实,unicode 特定于 Python 2。在 Python 3 中,使用 str
  • 所以如果我在 python 2.7 或 python 3 中检查basestring,我会得到相同的结果吗?
  • @Gulzar:根据我的回答:basestring 仅在 Python 2 中可用。所以没有。
  • 好的,你会怎么写这个兼容python 2和3?
  • @Gulzar:取决于上下文。如果您想允许 text,则可能使用名称错误保护:try: strtype = basestringexcept NameError: strtype = str,然后使用 isinstance(..., strtype)
【解决方案3】:

是否有 Unicode 字符串对象类型?

是的,它叫unicode

>>> s = u'hello'
>>> isinstance(s, unicode)
True
>>>

请注意,在 Python 3.x 中,此类型已被删除,因为 all strings are now Unicode

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多