182

我知道我可以使用:isinstance(x, str)在 python-3.x 中,但我还需要检查某些内容是否是 python-2.x 中的字符串。会isinstance(x, str)在 python-2.x 中按预期工作吗?还是我需要检查版本并使用isinstance(x, basestr)

具体来说,在 python-2.x 中:

>>>isinstance(u"test", str)
False

而python-3.x没有u"foo"

4

10 回答 10

216

如果您正在编写与 2.x 和 3.x 兼容的代码,您可能需要使用6 个

from six import string_types
isinstance(s, string_types)
于 2012-07-02T21:23:46.460 回答
121

我发现的最简洁的方法不依赖于像六个这样的包,是:

try:
  basestring
except NameError:
  basestring = str

然后,假设您一直在以最通用的方式检查 Python 2 中的字符串,

isinstance(s, basestring)

现在也适用于 Python 3+。

于 2014-03-27T06:35:05.343 回答
37

怎么样,在所有情况下都有效?

isinstance(x, ("".__class__, u"".__class__))
于 2015-11-13T18:40:17.710 回答
19

这是@Lev Levitsky 的答案,稍微改写了一下。

try:
    isinstance("", basestring)
    def isstr(s):
        return isinstance(s, basestring)
except NameError:
    def isstr(s):
        return isinstance(s, str)

try/测试完成一次,然后except定义一个始终有效且尽可能快的函数。

编辑:实际上,我们甚至不需要调用isinstance(); 我们只需要评估basestring,看看我们是否得到NameError

try:
    basestring  # attempt to evaluate basestring
    def isstr(s):
        return isinstance(s, basestring)
except NameError:
    def isstr(s):
        return isinstance(s, str)

不过,我认为调用 to 更容易isinstance()

于 2012-07-02T22:01:44.517 回答
11

future添加(到 Python 2)兼容名称,因此您可以继续编写 Python 3。您可以简单地执行以下操作:

from builtins import str
isinstance(x, str) 

要安装它,只需执行pip install future.

需要注意的是,它只支持python>=2.6, >=3.3,但它比six, 更现代,只有在使用时才推荐python 2.5

于 2017-10-09T08:22:07.597 回答
8

也许使用类似的解决方法

def isstr(s):
    try:
        return isinstance(s, basestring)
    except NameError:
        return isinstance(s, str)
于 2012-07-02T21:09:39.580 回答
8

您可以通过调用来获取对象的类object.__class__,因此为了检查对象是否为默认字符串类型:

    isinstance(object,"".__class__)

您可以将以下内容放在代码的顶部,以便用引号括起来的字符串在 python 2 中是 unicode:

    from __future__ import unicode_literals
于 2013-02-28T05:35:08.730 回答
1

您可以在代码开头尝试此操作:

from __future__ import print_function
import sys
if sys.version[0] == "2":
    py3 = False
else:
    py3 = True
if py3: 
    basstring = str
else:
    basstring = basestring

稍后在代码中:

anystring = "test"
# anystring = 1
if isinstance(anystring, basstring):
    print("This is a string")
else:
    print("No string")
于 2019-03-19T06:47:41.380 回答
1

当心!在python 2中,strbytes本质上是一样的。如果您试图区分两者,这可能会导致错误。

>>> size = 5    
>>> byte_arr = bytes(size)
>>> isinstance(byte_arr, bytes)
True
>>> isinstance(byte_arr, str)
True
于 2019-10-07T23:05:41.897 回答
-5

类型(字符串)== str

如果是字符串则返回 true,否则返回 false

于 2016-06-08T18:42:34.900 回答